【数据挖掘】K-Means聚类算法

574 阅读5分钟

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战」。

数据挖掘的过程

聚类分析

聚类分析是根据数据本身结构特征对数据点进行分类的方法。实质是按照彼此距离 的远近将数据分为若干个类别,以使得类别内数据的“差异性”尽可能小(即“同质 性”尽可能大),类别间“差异性”尽可能大。

聚类算法

聚类的目标:将一组数据分成若干组,组 内数据是相似的,而组间数据是有较明显 差异。

与分类区别:分类与聚类最大的区别在于分 类的目标事先已知,聚类也被称为无监督机器学习。

聚类手段:①划分法 ②层次方法 ③基于密 度方法 ④基于网络方法 ⑤基于模型方法

K-Means时十大数据挖掘算法之一:

  1. C4.5
  2. K-Means
  3. SVM
  4. Apriori
  5. EM
  6. AdaBoost
  7. PageRank
  8. KNN
  9. Naive Bayes
  10. CART

度量法则

欧式距离

欧氏距离 (欧几里得距离,Euclidean distance)

– N维空间内任意两点x(x1,...xn)x(x1,...xn)y(y1,...yn)y(y1,...yn)之间的距离为

(x1y1)2+(x2y2)2++(xnyn)2=i=1n(xiyi)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}} }

曼哈顿距离

d(x,y)=x1y1+x2y2++xnynd\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)=x1y1p+x2y2p++xnynppd\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}

欧氏距离和曼哈顿距离可以看做是闵可夫斯基距离在p=2p=2p=1p=1下的特例

k-均值算法 (k-Means)特性

  1. 聚类算法将数据点分为多个簇(cluster)
  2. k-menas算法中,簇的中心叫做簇质心或中心点 (centroid),质心不一定是一个真实存在的数据点.
  3. 把每个簇想像成一块有质量的物体,质心即这块物体的质量中心。
  4. k-means要求事先指定数据要分为几组,例如可指定分为44组,这里的44即算法名称中kk的含义,此时k=4k=4

K-均值算法流程描述

指定n=kn=k(kk为要分的组数)

  1. 随机挑选nn个点作为初试簇质心。
  2. 遍历所有点,各自加入距离最近的簇(距离可以用欧式距离,需要对数据进行标准化)。
  3. 调整各个簇的质心(取簇中各点的算术平均值作为新质心的坐标即可)。
  4. 回到第二步。

终止条件:簇不再发生变化

如何评价聚类结果的质量?

  • 好的聚类结果的簇内数据点比较紧凑,簇间相距大, 即簇内中各数据点离质心的距离都比较小。
  • 可使用误差平方和(SSE, Sum of Squared Errors) 准则函数来评价。
  • 一个簇的误差平方和即簇内各点到质心欧式距离的 平方和:
SSE(k)=pXdistance(p,centroid)2SSE(k) = \sum\limits_{p \in X} {distance{{(p,centroid)}^2}}

其中pp表示簇中的点,XX是簇内点的集合,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<temp2)
        count(1)=count(1)+1;
        allsum(1,1)=allsum(1,1)+x(i,1);
        allsum(1,2)=allsum(1,2)+x(i,2);
        else
        count(2)=count(2)+1;
        allsum(2,1)=allsum(2,1)+x(i,1);
        allsum(2,2)=allsum(2,2)+x(i,2);
     end
    end 
    %重新计算两个聚类中心点
    z1(1,1)=allsum(1,1)/count(1);
    z1(1,2)=allsum(1,2)/count(1);
    z1(2,1)=allsum(2,1)/count(2);
    z1(2,2)=allsum(2,2)/count(2);
    if(z==z1)%聚类中心不再变化时,结束 
        break;
    else
        z=z1;
    end   
end 
disp(z1);%输出聚类中心 
%绘制所有样本点
plot(x(:,1),x(:,2),'k*')
hold on 
%绘制聚类中心点
plot(z1(:,1),z1(:,2),'ro')
set(gca,'linewidth',1);
xlabel('特征x1','fontsize',12);
ylabel('特征x2','fontsize',12);
title('K-means 分类图','fontsize',12);

matlab函数

  • [IDX,C,sumd,D]=kmeans(x,k,param1,val1,param2,val2,…)
  • X为输入数据,k为聚类数
  • IDX为每个样本数据的类别
  • C为返回的k个类别的中心向量
  • sumd为返回每个类别样本到中心向量的距离和
  • D为返回每个样本到中心的距离,附加参数 param1,val1,param2,val2,…如下表

附加参数表

参数名参数值说明
distance距离计算函数,默认选项
sqEuclidean平方欧式距离
Cosine余弦距离
Correlation相关系数距离
Hamming汉明距离
emptyaction当一个距离中心没有一个样本值时的操作
error把一个空聚类作为错误,默认选项
drop把空聚类移除
singleton为距离聚类中心最远的点创建一个聚类中心
MaxIter100循环的次数,默认为100
replicates1始值,根据sumd的值返回最佳的初始值聚类结果
start用于初始化聚类中心向量的方法
sample随机选择,默认选项 uniform随机均匀的选择k个中心向量
cluster使用样本数据的10%进行预分类
matrixK*p维的矩阵,即自己制定聚类中心
uniform随机均匀的选择k个中心向量

k-means聚类算法的实现:

利用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');