聚类分析Kmean

本文详细介绍了K-Mean聚类算法,包括其核心思想、算法步骤和R语言的计算过程演示。讨论了样本选择问题,如k值选取、初始质心选择、距离度量和算法停止条件。此外,还对比分析了层次聚类和K-Mean的优缺点,并提到了EM算法在处理缺失数据时的优势。
摘要由CSDN通过智能技术生成
1、聚类的使用

1)事先不知道样本的类别,甚至不知道需要得出的类别个数。
2)样本类别之间有差异性,分类结果能很好地解释预期现象。
3)一般用于数据探索,比如发现群组和离群点检测,还可以作为其他算法的预处理步骤。

2、样本选择:

很多教程都告诉我们基于划分方法的聚类多适用于中等体量的数据集,但我们也不知道“中等”到底有多“中”。通常认为记录数量一般没有限制,与实际应用有关,但样本中记录个数一般要大于聚类数的平方。

3、K-Mean聚类算法:

聚类分析是一种分类的多元统计分析方法。按照个体或样品的特征将它们分类,使同种类别的样本放到一起,所有样本最终会形成K个簇,在同一类别内的个体具有尽可能高的同质性(homogeneity) 。它属于无监督学习。

核心思想:

根据给定的K值和K个初始质心将样本中每个点都分到距离最近的类簇中,当所有点分配完后根据每个类簇的所有点重新计算质心,一般是通过平均值计算,然后再将每个点分到距离最近的新类簇中,不断循环此操作,直到质心不再变化或达到一定的迭代次数。

K-means 聚类算法的优点:对大数据集合聚类效果明显,聚类快速且易于实现。

算法步骤:

Kmeans算法的步骤如下:

在MATLAB中,可以使用自带的kmeans函数进行k-means聚类。首先,使用kmeans函数将数据分成指定数量的簇,例如cluster_num=3,即将数据分成3个簇。然后,可以使用unique函数找出分类出的个数,并使用cell数组存储每个簇中的数据索引。接下来,遍历每个簇,获取对应的数据并使用scatter函数绘制散点图表示每个簇的数据。同时,可以使用plot函数绘制簇的中心点。最后,可以计算轮廓系数(SC)来评估聚类效果。轮廓系数可以使用mean函数计算silhouette函数返回的值。整个过程的代码示例如下: ``` cluster_num=3; %自定义分类数 [index_km,center_km]=kmeans(data,cluster_num); %MATLAB自带kmeans函数 a=unique(index_km); %找出分类出的个数 C=cell(1,length(a)); for i=1:length(a) C(1,i)={find(index_km==a(i))}; end figure subplot(2,1,2) for j=1:cluster_num data_get=data(C{1,j},:); scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9); hold on end plot(center_km(:,1),center_km(:,2),'kd','LineWidth',2); hold on sc_k=mean(silhouette(data,index_km)); title_str1=['MATLAB自带kmeans函数',' 聚类数为:',num2str(cluster_num),' SC轮廓系数:',num2str(sc_k)]; title(title_str1); ``` 可以在MATLAB中运行以上代码来进行k-means聚类,并可视化聚类结果。 此外,您还可以参考GitHub的一个示例代码,链接如下:[https://github.com/Qyokizzzz/AI-Algorithm/tree/master/K-means](https://github.com/Qyokizzzz/AI-Algorithm/tree/master/K-means) 。 另外,您还可以通过分析数据,选择最佳的k值进行聚类。例如,可以加载fisheriris数据集,并使用其meas的前两个维度来进行聚类。以下是一个示例脚本: ``` load fisheriris data = normalization(meas); [idx,C,~ = Kmeans(data(:,1:2),3,0,5000); figure gscatter(data(:,1),data(:,2),idx,'bgm') hold on plot(C(:,1),C(:,2),'kx') legend('Cluster 1','Cluster 2','Cluster 3','ClusterCentroid') ``` 上述代码将fisheriris数据集进行了归一化处理,并使用Kmeans函数将数据聚类成3个簇。通过gscatter函数绘制散点图表示不同簇的数据,并使用plot函数绘制簇的中心点。 最后,您还可以编写一个计算"有序属性"距离的函数来计算样本点之间的闵可夫斯基距离。例如,可以使用cal_dist函数计算两个样本点之间的欧氏距离或曼哈顿距离。以下是一个示例代码: ``` function dist = cal_dist(X,p) dim = size(X); sum = 0; for i = 1:dim(2) sum = sum + abs(X(1,i)-X(2,i))^p; end dist = sum^(1/p); end ``` 该函数可以根据指定的p值计算两个样本点之间的闵可夫斯基距离,其中p=2为欧氏距离,p=1为曼哈顿距离。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值