在我的程序中,我将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) 假设我们有一个64dim矩阵来聚类,假设矩阵数据集是dt = 64x150.
使用vl_feat的库中的kmeans函数,我将我的数据集聚集到20个中心:
[centers, assignments] = vl_kmeans(dt, 20);
Run Code Online (Sandbox Code Playgroud)
centers
是一个64x20矩阵.
assignments
是一个1x150矩阵,其中包含值.
根据手册:向量分配包含输入数据到集群的(硬)分配.
我仍然无法理解矩阵中的这些数字是什么assignments
意思.我根本得不到它.有人介意帮我一点吗?一个例子或一些东西会很棒.这些价值观代表什么呢?
我在下面有一个来自大型数据集的示例数据,其中每个参与者都有多个评分条件。
Participant<-c("p1","p1","p2","p2","p3","p3")
Condition<-c( "c1","c2","c1","c2","c1","c2")
Score<-c(4,5, 5,7,8,2)
T<-data.frame(Participant, Condition, Score)
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 K 均值聚类将参与者分成不同的组,考虑到条件不是数字,有什么好的方法吗?
谢谢!
我想使用GMM(高斯混合模型来聚类二进制图像,并且还想在二进制图像本身上绘制聚类质心).
我使用它作为我的参考:http: //in.mathworks.com/help/stats/gaussian-mixture-models.html
这是我的初始代码
I=im2double(imread('sil10001.pbm'));
K = I(:);
mu=mean(K);
sigma=std(K);
P=normpdf(K, mu, sigma);
Z = norminv(P,mu,sigma);
X = mvnrnd(mu,sigma,1110);
X=reshape(X,111,10);
scatter(X(:,1),X(:,2),10,'ko');
options = statset('Display','final');
gm = fitgmdist(X,2,'Options',options);
idx = cluster(gm,X);
cluster1 = (idx == 1);
cluster2 = (idx == 2);
scatter(X(cluster1,1),X(cluster1,2),10,'r+');
hold on
scatter(X(cluster2,1),X(cluster2,2),10,'bo');
hold off
legend('Cluster 1','Cluster 2','Location','NW')
P = posterior(gm,X);
scatter(X(cluster1,1),X(cluster1,2),10,P(cluster1,1),'+')
hold on
scatter(X(cluster2,1),X(cluster2,2),10,P(cluster2,1),'o')
hold off
legend('Cluster 1','Cluster 2','Location','NW')
clrmap = jet(80); colormap(clrmap(9:72,:))
ylabel(colorbar,'Component 1 Posterior Probability')
Run Code Online (Sandbox Code Playgroud)
但问题是我无法在主二进制图像中绘制从GMM接收的聚类质心.我该怎么做?
**现在假设我有一个序列中的10个这样的图像我想将它们的平均位置的信息存储在两个单元格数组中然后我该怎么做.这是我的代码我的新问题**
images=load('gait2go.mat');%load the matrix file
for i=1:10
I{i}=images.result{i}; …
Run Code Online (Sandbox Code Playgroud) matlab classification cluster-analysis machine-learning mixture-model
我有一个包含分类和数字变量的数据框。我想使用高尔距离对这些数据进行聚类,并像 kmeans 函数一样将聚类值作为向量获取。我怎样才能做到这一点?
我知道这Gaussian mixture model
是一个概括K-means
,因此应该更准确.
但我无法在下面的聚类图像上看出为什么获得的结果K-means
在某些区域更准确(如斑点噪声显示为浅蓝色点,在Gaussian Mixture Model
结果中持续存在于结果中而不是K-means
结果中).
以下是matlab
两种方法的代码:
% kmeans
L1 = kmeans(X, 2, 'Replicates', 5);
kmeansClusters = reshape(L1, [numRows numCols]);
figure('name', 'Kmeans clustering')
imshow(label2rgb(kmeansClusters))
% gaussian mixture model
gmm = fitgmdist(X, 2);
L2 = cluster(gmm, X);
gmmClusters = reshape(L2, [numRows numCols]);
figure('name', 'GMM clustering')
imshow(label2rgb(gmmClusters))
Run Code Online (Sandbox Code Playgroud)
并在下面显示原始图像,以及聚类结果:
原始图片:
K-方式:
高斯混合模型:
PS:我只使用强度信息进行聚类,聚类的数量是2
(即水和土地).
下面是变量的前 5 行,我使用 KMeans 来找到最佳的簇数-
store_code PinCode sale_price_after_promo
0 2655 453441.0 55.00
1 2655 999999.0 30.00
2 2655 400064.0 418.95
3 2615 400099.0 70.00
4 2655 474001.0 34.20
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误 -
OverflowError Traceback (most recent call last)
<ipython-input-62-3802a2b79f71> in <module>()
2 for i in range(0,11):
3 kmeans=KMeans(n_clusters=i, init='k-means++', random_state=42)
----> 4 kmeans.fit(X)
5 wcss.append(kmeans.inertia_)
6 plt.plot(range(1, 11), wcss)
OverflowError: cannot convert float infinity to integer
Run Code Online (Sandbox Code Playgroud)
即使我尝试使用各种变量组合但仍然出现相同的错误,如何摆脱这个错误?
我已使用sklearn高斯混合模型算法(GMM)对数据(75000,3)进行了聚类。我有4个集群。我数据的每一点代表一个分子结构。现在,我想获得每个簇的最具代表性的分子结构,据我了解,它们是该簇的质心。到目前为止,我已经尝试使用gmm.means_属性定位在群集中心的点(结构),但是确切的点并不对应于任何结构(我使用numpy.where)。我将需要获取最接近质心的结构的坐标,但是在模块的文档中(http://scikit-learn.org/stable/modules/generation/sklearn),我还没有找到执行此功能的函数。 blend.GaussianMixture.html)。如何获得每个群集的代表性结构?
非常感谢您的帮助,任何建议将不胜感激。
((由于这是一个通用问题,我发现没有必要添加用于集群或任何数据的代码,请让我知道是否有必要))
尝试调用sklearn.metrics.silhouette_samples时出现内存错误。我的用例与本教程相同。我在 Python 3.5 中使用 scikit-learn 0.18.1。
对于相关的功能,silhouette_score,这篇文章建议使用sample_size参数,它可以在调用剪影_samples之前减少样本大小。我不确定下采样仍然会产生可靠的结果,所以我犹豫不决。
我的输入 X 是一个 [107545 行 x 12 列] 数据帧,虽然我只有 8gb 的 RAM,但我不会真正认为它很大
sklearn.metrics.silhouette_samples(X, labels, metric=’euclidean’)
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-39-7285690e9ce8> in <module>()
----> 1 silhouette_samples(df_scaled, df['Cluster_Label'])
C:\Users\KE56166\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\sklearn\metrics\cluster\unsupervised.py in silhouette_samples(X, labels, metric, **kwds)
167 check_number_of_labels(len(le.classes_), X.shape[0])
168
--> 169 distances = pairwise_distances(X, metric=metric, **kwds)
170 unique_labels = le.classes_
171 n_samples_per_label = np.bincount(labels, minlength=len(unique_labels))
C:\Users\KE56166\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\sklearn\metrics\pairwise.py in pairwise_distances(X, Y, metric, n_jobs, …
Run Code Online (Sandbox Code Playgroud) 似乎“SwarmSVM”包曾经有一个 kmeans.predict 函数,但现在没有了。
我想将数据帧划分为训练+测试子集以训练模型然后对其进行测试。我目前只能使用 'kmeans' 函数来创建集群,但我无法弄清楚使用哪些函数/包来训练和测试模型。
cluster-analysis ×10
k-means ×6
matlab ×3
r ×3
python ×2
scikit-learn ×2
algorithm ×1
centroid ×1
data-mining ×1
gaussian ×1
gmm ×1
java ×1
mean ×1
mixed-type ×1
numpy ×1
opencv ×1
vlfeat ×1