源代码
聚类分析是根据数据本身结构特征对数据点进行分类的方法。实质是按照彼此距离 的远近将数据分为若干个类别,以使得类别内数据的“差异性”尽可能小(即“同质 性”尽可能大),类别间“差异性”尽可能大。
聚类的目标:将一组数据分成若干组,组 内数据是相似的,而组间数据是有较明显 差异。
与分类区别:分类与聚类最大的区别在于分 类的目标事先已知,聚类也被称为无监督机器学习。
聚类手段:①划分法 ②层次方法 ③基于密 度方法 ④基于网络方法 ⑤基于模型方法
欧氏距离 (欧几里得距离,Euclidean distance)
– N维空间内任意两点 x ( x 1 , . . . x n ) x(x1,...xn) x(x1,...xn)和 y ( y 1 , . . . y n ) y(y1,...yn) y(y1,...yn)之间的距离为
( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + ⋯ + ( x n − y n ) 2 = ∑ i = 1 n ( x i − y i ) 2 \sqrt {{{({x_1} - {y_1})}^2} + {{({x_2} - {y_2})}^2} + \cdots + {{({x_n} - {y_n})}^2}} = \sqrt {\sum\limits_{i = 1}^n {{{({x_i} - {y_i})}^2}} } (x1−y1)2+(x2−y2)2+⋯+(xn−yn)2=i=1∑n(xi−yi)2
d ( x , y ) = ∣ x 1 − y 1 ∣ + ∣ x 2 − y 2 ∣ + ⋯ + ∣ x n − y n ∣ d\left( x,y \right) =\left| x_1-y_1 \right|+\left| x_2-y_2 \right|+\cdots +\left| x_n-y_n \right| d(x,y)=∣x1−y1∣+∣x2−y2∣+⋯+∣xn−yn∣
d ( x , y ) = ∣ x 1 − y 1 ∣ p + ∣ x 2 − y 2 ∣ p + ⋯ + ∣ x n − y n ∣ p p d\left( x,y \right) =\sqrt[p]{\left| x_1-y_1 \right|^p+\left| x_2-y_2 \right|^p+\cdots +\left| x_n-y_n \right|^p} d(x,y)=p∣x1−y1∣p+∣x2−y2∣p+⋯+∣xn−yn∣p
欧氏距离和曼哈顿距离可以看做是闵可夫斯基距离在 p = 2 p=2 p=2和 p = 1 p=1 p=1下的特例
指定 n = k n=k n=k( k k k为要分的组数)
终止条件:簇不再发生变化
S S E ( k ) = ∑ p ∈ X d i s t a n c e ( p , c e n t r o i d ) 2 SSE(k) = \sum\limits_{p \in X} {distance{{(p,centroid)}^2}} SSE(k)=p∈X∑distance(p,centroid)2
其中 p p p表示簇中的点, X X X是簇内点的集合,distance(p, centroid)即点p到簇质心的距离
聚类结果的SSE即各个簇的SSE之和,其值越 小表示聚类质量越好
以二维为例
%K_means聚类算法实例
%数据初始化
clear
x=[0 0;1 0;0 1;1 1;2 1;1 2;2 2; 3 2;6 6;7 6;8 6;6 7;7 7;8 7;9 7;7 8; 8 8;9 8; 8 9;9 9];
z=zeros(2,2);
z1=zeros(2,2);
%设置初始中心点为前两个样本点
z=x(1:2,1:2);
%寻找聚类中心
while 1
count=zeros(2,1);%为求解聚类中心 计次数
allsum=zeros(2,2);%为求解聚类中心 计数据之和
for i=1:20
%对每一个样本i,求i到两个聚类中心点的距离
temp1=sqrt((z(1,1)-x(i,1))^2+(z(1,2)-x(i,2))^2);
temp2=sqrt((z(2,1)-x(i,1))^2+(z(2,2)-x(i,2))^2);
%到哪个聚类中心点距离较小,就将i分配该聚类中心
if (temp1
附加参数表
参数名 | 参数值 | 说明 |
---|---|---|
distance | 距离计算函数,默认选项 | |
sqEuclidean | 平方欧式距离 | |
Cosine | 余弦距离 | |
Correlation | 相关系数距离 | |
Hamming | 汉明距离 | |
emptyaction | 当一个距离中心没有一个样本值时的操作 | |
error | 把一个空聚类作为错误,默认选项 | |
drop | 把空聚类移除 | |
singleton | 为距离聚类中心最远的点创建一个聚类中心 | |
MaxIter | 100 | 循环的次数,默认为100 |
replicates | 1 | 始值,根据sumd的值返回最佳的初始值聚类结果 |
start | 用于初始化聚类中心向量的方法 | |
sample | 随机选择,默认选项 uniform随机均匀的选择k个中心向量 | |
cluster | 使用样本数据的10%进行预分类 | |
matrix | K*p维的矩阵,即自己制定聚类中心 | |
uniform | 随机均匀的选择k个中心向量 |
利用matlab中的鸢尾花数据集来举例
load fisheriris %载入数据集
X = meas(:,3:4);%取花瓣长度和宽度两个特征
figure;
plot(X(:,1),X(:,2),'k*');%画出图形表示样本
title 'Fisher''s Iris Data';
xlabel 'Petal Lengths (cm)';
ylabel 'Petal Widths (cm)';
[idx,C] = kmeans(X,3);%聚类
hold on
plot(C(:,1),C(:,2),'ro');%画出聚类中心
plot(C(:,1),C(:,2),'bx');