一、基本思想
将未知的样本,划分为由类似的对象组成的多个类
二、聚类方法
k-means(原型聚类)
实现步骤:
①指定需要划分类的个数k
②随机选择k个数据作为聚类的中心(不一定是样本数据)
③计算其余各点到各个聚类中心点的聚类,然后把它们依次分配到聚类他们最近的聚类中心点所在的簇
④调整新类,并重新计算新类的中心,循环2、3步
⑤看中心是否收敛,如果收敛则结束
matlab代码:
clear all
close all
%导入其自带的数据集fisheriris
%该数据集总共统计了三种鸢尾花的花萼长、花萼宽、花瓣长和花瓣宽
load fisheriris;
X; % 存放所有输入变量,样本集个数n=150, 特征个数m=4
Y; % 存放输出变量/标签, 一共3类,k=3
% 数据预处理:中心化处理(消除特征之间的差异)
meanX = ones(size(X,1),1) * mean(X);
dataX = X - meanX;
% kmeans聚类
% kmeans使用平方欧几里得距离(sqeuclidean)度量和k-means++算法进行聚类中心初始化
cluster_num=3; %自定义分类数
iterations=100;
[index_km,center_km] = kmeans(dataX,cluster_num,'distance','sqeuclidean','maxIter', iterations);
% [index_km,center_km] = kmeans(dataX,cluster_num,'distance','cityblock','maxIter', iterations);
% 可视化,注意:数据集每个样本是4个特征,可视化时仅用了前两个特征!
a=unique(index_km); % 找出聚类的个数
C=cell(1,length(a)); % 创建元胞数组
% 存放每一类的样本的序号
for i=1:length(a)
C(1,i)={find(index_km==a(i))};
end
color={'g.','r.','c.','m.','y.','k.'};
for j=1:cluster_num
data_get=dataX(C{1,j},:);
scatter(data_get(:,1),data_get(:,2),'*',color{j})
hold on
end
plot(center_km(:,1),center_km(:,2),'kd','LineWidth',2);
hold on
% 计算SC轮廓系数,值介于[-1,1],越大越好
sc_k=mean(silhouette(dataX,index_km));
title_str1=['kmeans',' k=',num2str(cluster_num),' sc_k=',num2str(sc_k)];
title(title_str1)