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

源代码

数据挖掘的过程

聚类分析

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

聚类算法

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

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

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

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

闵可夫斯基距离

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)=px1y1p+x2y2p++xnynp

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

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

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

K-均值算法流程描述

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

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

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

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

  • 好的聚类结果的簇内数据点比较紧凑,簇间相距大, 即簇内中各数据点离质心的距离都比较小。
  • 可使用误差平方和(SSE, Sum of Squared Errors) 准则函数来评价。
  • 一个簇的误差平方和即簇内各点到质心欧式距离的 平方和:

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)=pXdistance(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<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');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cout0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值