如果我们将K-means和顺序K-means方法应用于具有相同初始设置的相同数据集,我们是否会获得相同的结果?解释你的理由.
我个人认为答案是否定的.顺序K-means获得的结果取决于数据点的呈现顺序.结局条件不一样.
这里附加两个聚类算法的伪代码.
K-手段
Make initial guesses for the means m1, m2, ..., mk
Until there is no change in any mean
Assign each data point to the cluster whose mean is the nearest.
Calculate the mean of each cluster.
For i from 1 to k
Replace mi with the mean of all examples for cluster i.
end_for
end_until
Run Code Online (Sandbox Code Playgroud)
顺序K均值
Make initial guesses for the means m1, m2, ..., mk
Set the counts n1, n2, ..., nk to zero
Until …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Java编写一组关于特定主题的新闻文章.我使用Crawler4J抓取了有关特定主题的新闻网站,将我自己的TF/IDF实现与语料库进行比较(有理由说我没有使用内置的Weka或TF/IDF的其他实现,但它们可能已经出来了这个问题的范围)并应用了一些其他特定于域的逻辑,这些逻辑为每个文档留下了一袋单词+权重(我将其存储在值为0到1之间的Map中).我想通过查看单词权重来聚类关于类似主题的文章,所以我开始使用Weka的EM和SimpleKMeans群集.问题是我得到了相当不起眼的结果,而且我
例如,在约300篇文章的玩具数据集中,如果我将每个文档中的单词修剪为前20,然后使用完整的单词作为特征,我最终得到~2k独特的特征.我正在使用每篇文章作为训练实例,并尝试使用一些不同的参数来调整SimpleKMeans聚类器(例如~20-30个聚类,100个最大迭代).当我一目了然地看到数据时,我发现很多文章的关键词看起来非常密切相关,所以我期望高质量的结果和一堆包含~5-10篇文章的集群.不幸的是,结果通常是一个集群,其中有一半的文章,一堆集群各有一篇文章,还有一些散落者有2-5篇左右的文章.
这些结果是预期的,还是有办法获得更高质量的结果?请注意,我还研究了LingPipe和其他提供集群功能的框架,并使用滚动我自己的EM实现(具有适度但不是很大的成功).在此先感谢您的帮助!
我有一个510x6的数据矩阵,并希望对此进行K-means聚类分析.我在绘制2维中的所有不同聚类时遇到问题.是不是可以在2个维度上绘制6个不同的聚类?
在我的程序中,我将k = 2用于k-mean算法,即我只想要2个簇.我已经以一种非常简单明了的方式实现了,我仍然无法理解为什么我的程序进入无限循环.任何人都可以指导我在哪里犯错误..?
为简单起见,我已经在程序代码本身中获取了输入.这是我的代码:
import java.io.*;
import java.lang.*;
class Kmean
{
public static void main(String args[])
{
int N=9;
int arr[]={2,4,10,12,3,20,30,11,25}; // initial data
int i,m1,m2,a,b,n=0;
boolean flag=true;
float sum1=0,sum2=0;
a=arr[0];b=arr[1];
m1=a; m2=b;
int cluster1[]=new int[9],cluster2[]=new int[9];
for(i=0;i<9;i++)
System.out.print(arr[i]+ "\t");
System.out.println();
do
{
n++;
int k=0,j=0;
for(i=0;i<9;i++)
{
if(Math.abs(arr[i]-m1)<=Math.abs(arr[i]-m2))
{ cluster1[k]=arr[i];
k++;
}
else
{ cluster2[j]=arr[i];
j++;
}
}
System.out.println();
for(i=0;i<9;i++)
sum1=sum1+cluster1[i];
for(i=0;i<9;i++)
sum2=sum1+cluster2[i];
a=m1;
b=m2;
m1=Math.round(sum1/k);
m2=Math.round(sum2/j);
if(m1==a && m2==b)
flag=false;
else
flag=true;
System.out.println("After iteration "+ n +" , …Run Code Online (Sandbox Code Playgroud) 我对K-Means的工作方式感到迷茫和困惑.到目前为止我所知道的是
我已经实现了获取包含这些点的文本文件.选择文件后,将绘制点.现在我停在那里.
这是我想知道的:
1.我想知道在绘制点之后我应该做的下一件事,因为我不确定我上面说的算法.
2.我想知道迭代是如何工作的,迭代得到每个点的最终类.我很困惑,因为我不知道如果从类最近的点获得类,拾取点如何更改类
任何帮助将非常感激.
我有一个CSV文件如下:
id,at1,at2,at3
1072,0.5,0.2,0.7
1092,0.2,0.5,0.7
...
Run Code Online (Sandbox Code Playgroud)
我已经将它加载到Weka中进行聚类:
DataSource source = new DataSource("test.csv");
Instances data = source.getDataSet();
kmeans.buildClusterer(data);
Run Code Online (Sandbox Code Playgroud)
问题1:如何将第一列设置为ID?即.忽略第一列用于聚类目的.
然后我尝试打印出作业:
int[] assignments = kmeans.getAssignments();
int i = 0;
for (int clusterNum : assignments) {
System.out.printf("Instance %d -> Cluster %d \n", i, clusterNum);
i++;
}
Run Code Online (Sandbox Code Playgroud)
这打印:
Instance 1 -> Cluster 0
Instance 2 -> Cluster 2
...
Run Code Online (Sandbox Code Playgroud)
问题2:打印作业时如何参考ID?例如:
Instance 1072 -> Cluster 0
Instance 1092 -> Cluster 2
Run Code Online (Sandbox Code Playgroud) 我正在研究一个广告点击推荐系统,在该系统中,我必须预测用户是否会点击广告。我总共具有98个功能,同时具有USER功能和ADVERTISEMENT功能。对于预测而言非常重要的某些功能具有这样的字符串值。
**FEATURE**
Inakdtive Kunmden
Stammkfunden
Stammkdunden
Stammkfunden
guteg Quartialskunden
gutes Quartialskunden
guteg Quartialskunden
gutes Quartialskunden
Run Code Online (Sandbox Code Playgroud)
整个数据列中有14种不同的字符串值。我的模型无法将字符串值作为输入,因此我必须将它们转换为分类int值。我不知道如何执行此操作并使这些功能有用。我正在使用K-MEANS聚类和随机森林算法。
我有这个矩阵:
x=[ 2+2*i 2-2*i -2+2*i -2-2*i];
Run Code Online (Sandbox Code Playgroud)
我想模拟传输它并为其添加噪声.我代表复数的组成部分如下:
A=randn(150,2)+2*ones(150,2); C=randn(150,2)-2*ones(150,2);
Run Code Online (Sandbox Code Playgroud)
在接收器处,我收到了下面的向量,其中组件根据我最初发送的内容(即 x)的组件进行排序.
X = [A A A C C A C C];
Run Code Online (Sandbox Code Playgroud)
现在我想应用kmeans(X)有4个集群,所以kmeans(X,4).我遇到以下问题:
X上面显示的复数. kmeans显示聚类的结果. k-means则使用聚类来决定传输信号是什么?我正在使用进行分层聚类分析 hclust()
代码如下所示:
hc <- hclust(dist(USArrests), "ave")
Run Code Online (Sandbox Code Playgroud)
现在,我需要的是获得一个表(或类似的东西),其中包含所有集群和属于它们的观察结果(通过它们的rowname,非数字),以便我可以将其保存到某些整体文件/数据框 - 例如Excel.(我想用不同的方法运行hclust几次,变量并最终评估结果.)
我现在,它可能很容易,但我被卡住了......你有什么建议吗?
Ps.:我也想知道它在使用时是如何工作的 kmeans()
我已经构建了一个KMeansModel.我的结果存储在一个名为的PySpark DataFrame中
transformed.
(a)我如何解释内容transformed?
(b)如何创建一个或多个Pandas DataFrame transformed,以显示14个集群中每个集群的13个特征中每个特征的摘要统计数据?
from pyspark.ml.clustering import KMeans
# Trains a k-means model.
kmeans = KMeans().setK(14).setSeed(1)
model = kmeans.fit(X_spark_scaled) # Fits a model to the input dataset with optional parameters.
transformed = model.transform(X_spark_scaled).select("features", "prediction") # X_spark_scaled is my PySpark DataFrame consisting of 13 features
transformed.show(5, truncate = False)
+------------------------------------------------------------------------------------------------------------------------------------+----------+
|features |prediction|
+------------------------------------------------------------------------------------------------------------------------------------+----------+
|(14,[4,5,7,8,9,13],[1.0,1.0,485014.0,0.25,2.0,1.0]) |12 |
|(14,[2,7,8,9,12,13],[1.0,2401233.0,1.0,1.0,1.0,1.0]) |2 |
|(14,[2,4,5,7,8,9,13],[0.3333333333333333,0.6666666666666666,0.6666666666666666,2429111.0,0.9166666666666666,1.3333333333333333,3.0])|2 |
|(14,[4,5,7,8,9,12,13],[1.0,1.0,2054748.0,0.15384615384615385,11.0,1.0,1.0]) |11 |
|(14,[2,7,8,9,13],[1.0,43921.0,1.0,1.0,1.0]) |1 |
+------------------------------------------------------------------------------------------------------------------------------------+----------+
only showing top 5 rows
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我从另一篇SO帖子中发现,我可以将功能映射到他们的名字,如下所示.在一个或多个Pandas数据帧中为每个集群的每个特征提供汇总统计(平均值,中值,标准,最小值,最大值)会很不错. …
cluster-analysis machine-learning k-means pyspark apache-spark-ml
k-means ×10
algorithm ×3
java ×3
matlab ×2
weka ×2
data-mining ×1
hclust ×1
matrix ×1
pyspark ×1
r ×1
scikit-learn ×1
sequential ×1