数据挖掘的过程
聚类分析
聚类分析是根据数据本身结构特征对数据点进行分类的方法。实质是按照彼此距离 的远近将数据分为若干个类别,以使得类别内数据的“差异性”尽可能小(即“同质 性”尽可能大),类别间“差异性”尽可能大。
聚类算法
聚类的目标:将一组数据分成若干组,组 内数据是相似的,而组间数据是有较明显 差异。
与分类区别:分类与聚类最大的区别在于分 类的目标事先已知,聚类也被称为无监督机器学习。
聚类手段:①划分法 ②层次方法 ③基于密 度方法 ④基于网络方法 ⑤基于模型方法
K-Means时十大数据挖掘算法之一:
- C4.5
- K-Means
- SVM
- Apriori
- EM
- AdaBoost
- PageRank
- KNN
- Naive Bayes
- 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}} } (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下的特例
k-均值算法 (k-Means)特性
- 聚类算法将数据点分为多个簇(cluster)
- k-menas算法中,簇的中心叫做簇质心或中心点 (centroid),质心不一定是一个真实存在的数据点.
- 把每个簇想像成一块有质量的物体,质心即这块物体的质量中心。
- 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为要分的组数)
- 随机挑选 n n n个点作为初试簇质心。
- 遍历所有点,各自加入距离最近的簇(距离可以用欧式距离,需要对数据进行标准化)。
- 调整各个簇的质心(取簇中各点的算术平均值作为新质心的坐标即可)。
- 回到第二步。
终止条件:簇不再发生变化
如何评价聚类结果的质量?
- 好的聚类结果的簇内数据点比较紧凑,簇间相距大, 即簇内中各数据点离质心的距离都比较小。
- 可使用误差平方和(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)=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<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 | 为距离聚类中心最远的点创建一个聚类中心 | |
MaxIter | 100 | 循环的次数,默认为100 |
replicates | 1 | 始值,根据sumd的值返回最佳的初始值聚类结果 |
start | 用于初始化聚类中心向量的方法 | |
sample | 随机选择,默认选项 uniform随机均匀的选择k个中心向量 | |
cluster | 使用样本数据的10%进行预分类 | |
matrix | K*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');