k-means聚类
- 基础概念
- 原理
- 基础概念
- 原理
- 步骤
- 评价
- K选取
- 1)拍脑袋法
- 2)肘部法则(Elbow Method)
- 影响因素
- 代码实现
- 数据读取
- 算法实现
- 绘图
- 打印聚类中心
- 完整代码
用于分类问题,例如:花的分类,消费特诊分类
基础概念
原理
用于分类问题,例如:花的分类,消费特诊分类
基础概念
原理
从上图中,我们可以看到,A,B,C,D,E是五个在图中点。而灰色的点是我们的种子点,也就是我们用来找点群的点。有两个种子点,所以K=2。
然后,K-Means的算法如下:
随机在图中取K(这里K=2)个种子点。
然后对图中的所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群。(上图中,我们可以看到A,B属于上面的种子点,C,D,E属于下面中部的种子点)
接下来,我们要移动种子点到属于他的“点群”的中心。(见图上的第三步)
然后重复第2)和第3)步,直到,种子点没有移动(我们可以看到图中的第四步上面的种子点聚合了A,B,C,下面的种子点聚合了D,E)。
步骤
评价
K选取
1)拍脑袋法
一个非常快速的,拍脑袋的方法是将样本量除以2再开方出来的值作为K值,具体公式为:
2)肘部法则(Elbow Method)
Elbow Method :Elbow意思是手肘,如下图左所示,此种方法适用于 K 值相对较小的情况,当选择的k值小于真正的时,k每增加1,cost值就会大幅的减小;当选择的k值大于真正的K时, k每增加1,cost值的变化就不会那么明显。这样,正确的k值就会在这个转折点,类似elbow的地方。 如下图:
通过画K与cost function的关系曲线图,如左图所示,肘部的值(cost function开始时下降很快,在肘部开始平缓了)做为K值,K=3。并不是所有的问题都可以通过画肘部图来解决,有的问题如右边的那个图,肘点位置不明显(肘点可以是3,4,5),这时就无法确定K值了。故肘部图是可以尝试的一种方法,但是并不是对所有的问题都能画出如左边那么好的图来确定K值。
Elbow Method公式:
影响因素
代码实现
数据读取
数据:consumption_data.xls
链接:https://pan.baidu/s/1y8iP7X6mTqiiTGeDtd84vQ
提取码:qm9p
inputfile = 'consumption_data.xls'; % 销量及其他属性数据
%% 读取数据
[num,txt]=xlsread(inputfile);
data = num(:,2:end); %读取excel第2至最后一列
data = zscore(data); %数据标准化
算法实现
k = 3; % 聚类的类别
iteration =500 ; % 聚类最大循环次数
distance = 'sqEuclidean'; % 距离函数
%% 调用kmeans算法
opts = statset('MaxIter',iteration);
[IDX,C,sumd,D]=kmeans(data,k,'distance',distance,'Options',opts);
绘图
上述k选取为3,所以适用r,b,y三种颜色
%% 绘制三维图
xlabel("R");
ylabel("F");
zlabel("M");
%plot3(data(:,1),data(:,2),data(:,3),".",'Color','r');
plot3(data(IDX==1,1),data(IDX==1,2),data(IDX==1,3),'r.','MarkerSize',12)
hold on
plot3(data(IDX==2,1),data(IDX==2,2),data(IDX==2,3),'b.','MarkerSize',12)
hold on;
plot3(data(IDX==3,1),data(IDX==3,2),data(IDX==3,3),'y.','MarkerSize',12)
hold on;
plot3(C(:,1),C(:,2),C(:,3),"o",'Color','b');
打印聚类中心
%% 打印结果
for i=1:k
disp(['第' num2str(i) '组聚类中心为:']);
disp(C(i,:));
end
完整代码
%% 使用K-Means算法聚类消费行为特征数据
clear ;
% 参数初始化
inputfile = 'consumption_data.xls'; % 销量及其他属性数据
k = 3; % 聚类的类别
iteration =500 ; % 聚类最大循环次数
distance = 'sqEuclidean'; % 距离函数
%% 读取数据
[num,txt]=xlsread(inputfile);
data = num(:,2:end); %读取excel第2至最后一列
data = zscore(data); %数据标准化
%% 调用kmeans算法
opts = statset('MaxIter',iteration);
[IDX,C,sumd,D]=kmeans(data,k,'distance',distance,'Options',opts);
%% 绘制三维图
xlabel("R");
ylabel("F");
zlabel("M");
%plot3(data(:,1),data(:,2),data(:,3),".",'Color','r');
plot3(data(IDX==1,1),data(IDX==1,2),data(IDX==1,3),'r.','MarkerSize',12)
hold on
plot3(data(IDX==2,1),data(IDX==2,2),data(IDX==2,3),'b.','MarkerSize',12)
hold on;
plot3(data(IDX==3,1),data(IDX==3,2),data(IDX==3,3),'y.','MarkerSize',12)
hold on;
plot3(C(:,1),C(:,2),C(:,3),"bo",'Color','b','MarkerSize',15);
%% 打印结果
for i=1:k
disp(['第' num2str(i) '组聚类中心为:']);
disp(C(i,:));
end
更多推荐
k-means模型(matlab实现)
发布评论