K-means算法与模糊聚类C-means算法
一. K-means算法
(一)原理
基于这一假说,在分类问题上我们可以更明确地界定解决方案的具体方向,并且可以系统地设计出一种科学的方法来进行分类操作。具体而言,在这种设定下我们希望实现的是尽可能地把彼此靠近的数据点归入同一个类别之中,并且在每一次迭代过程中都将每一个样本分配到最接近的那个中心点所在的簇中。为了更好地描述这一过程我们可以假定有N个观察值集合{x₁,x₂,…,xN}需要被划分成K个簇,并且这些簇各自的中心位置分别用向量形式表示为μ₁, μ₂,…, μK. 这样一来我们就可以通过下面所定义的目标函数来衡量整个系统的性能表现:
J = ∑{i=1}^{K} ∑{x∈C_i} ||x - μ_i||²

该模型旨在确定最优{ti}集合,并将其代入损失函数以使其最小化。通过这一过程, 我们可以直接计算出聚类中心{μi}. 可以看出, {ti}既体现了聚类的核心目标, 同时也构成了该模型的重要特性.
(二)模型收敛过程
在k-means的目标函数中包含两个关键未知参数:一个是样本划分{ti};另一个是聚类中心{μi}。这两个未知参数之间存在相互依存的关系:若已知样本划分结果,则各类样本均值即可确定各聚类中心;反之亦然,在已知各聚类中心的前提下,则需计算各样本与各类中心之间的距离,并据此判断样本归属哪一类。基于这一逻辑框架,请问如何利用EM算法来进行模型参数估计?具体操作如下:
- 首先随机确定k个聚类中心点
- 在这一基础上对数据进行分类,在这一过程中将数据划分为k个类别;其原则在于若某数据与某一聚类中心的距离小于其他,则将其归入该类别。
- 然后基于重新分配后的各类别数据重新计算新的聚类中心位置。
- 持续反复执行上述步骤直至聚类后的中心位置稳定不变。
(三)k-means算法优缺点
K-Means聚类算法的优点主要集中在:
1.算法快速、简单;
2.对大数据集有较高的效率并且是可伸缩性的;
- 具有近乎线性的计算复杂度,并且特别适用于处理海量数据。K-Means聚类算法的时间复杂度为O(nkt),其中n表示数据集中的对象数量,t为算法迭代的次数,并且k为聚类中心的数量。
K-Means聚类算法的缺点:
在K-means算法中参数K具有预先设定的特点,在实际应用中其取值具有较高的不确定性。由于在多数情况下人们无法准确预判给定数据集的理想分类数目,在这种状况下该算法就显得存在一定的局限性。这一缺陷表明了该算法在聚类分析中的局限性。基于方差分析框架下采用混合型F统计量的方法对聚类数目进行确定,并通过模糊划分熵计算结果进一步验证了该分类数的科学性
在K均值算法中,第一步是基于给定的初始聚类中心来进行初步数据划分.随后会对这一初步划分进行优化处理.由于初始聚类中心的设定会直接影响最终的聚类效果,因此如何合理地选择初值就成为了K均值算法研究中的关键问题.如果初值设定不当,则可能导致算法收敛至局部最优解而无法获得理想的结果.
基于 K-means 算法框架可以看出, 该算法需要持续地进行样本分类的调整, 并不断计算更新后的新的聚类中心. 因此当处理的数据量极大时, 该算法的时间开销会显著增大. 因此有必要对算法的时间复杂度进行分析与改进, 进而扩大其适用范围
(四)代码及实现
%随机获取150个点
X = [randn(50,2)+ones(50,2);randn(50,2)-ones(50,2);randn(50,2)+[ones(50,1),-ones(50,1)]];
opts = statset('Display','final');
%调用Kmeans函数
%X N*P的数据矩阵
%Idx N*1的向量,存储的是每个点的聚类标号
%Ctrs K*P的矩阵,存储的是K个聚类质心位置
%SumD 1*K的和向量,存储的是类间所有点与该类质心点距离之和
%D N*K的矩阵,存储的是每个点与所有质心的距离;
[Idx,Ctrs,SumD,D] = kmeans(X,3,'Replicates',3,'Options',opts);
%画出聚类为1的点。X(Idx==1,1),为第一类的样本的第一个坐标;X(Idx==1,2)为第二类的样本的第二个坐标
plot(X(Idx==1,1),X(Idx==1,2),'r.','MarkerSize',14)
hold on
plot(X(Idx==2,1),X(Idx==2,2),'b.','MarkerSize',14)
hold on
plot(X(Idx==3,1),X(Idx==3,2),'g.','MarkerSize',14)
%绘出聚类中心点,kx表示是圆形
plot(Ctrs(:,1),Ctrs(:,2),'kx','MarkerSize',14,'LineWidth',4)
plot(Ctrs(:,1),Ctrs(:,2),'kx','MarkerSize',14,'LineWidth',4)
plot(Ctrs(:,1),Ctrs(:,2),'kx','MarkerSize',14,'LineWidth',4)
legend('Cluster 1','Cluster 2','Cluster 3','Centroids','Location','NW')
Ctrs
SumD

Ctrs =
8780 -1.6206
-1.4337 -0.7981
1.3834 0.9229
SumD =
5390
58.9621
115.1753
二.C-means算法
(一)C-means算法原理
模糊c-均值聚类算法亦称为fuzzy c-means algorithm (FCMA)或fcm方法。在众多模糊聚类算法中, 模糊c-均值 (FCM) 算法具有广泛的使用效果, 它通过优化目标函数确定各数据点对各类中心的隶属程度, 从而实现自动分类的目的。

(二)代码实例
这里对颜色进行分类。下面介绍其重要程序代码:
-
MATLAB模糊C均值数据聚类识别函数
在MATLAB中(b=2),只要直接调用如下程序即可实现模糊C均值聚类:
[Center,U,obj_fcn]=fcm(data,cluster_n)
data:要聚类的数据集合,每一行为一个样本;
cluster_n:聚类数;
Center:最终的聚类中心矩阵,每一行为聚类中心的坐标值;
U:最终的模糊分区矩阵;
obj_fcn:在迭代过程中的目标函数值。
**注意:**在使用上述方法时,要根据中心坐标Center的特点分清楚每一类中心所代表的实际中的哪一类,然后才能准确地将待聚类的各方案准确地分为各自所属的类别;否则,就会出现张冠李戴的现象。 -
MATLAB实现
[center,U,obj_fcn] = fcm(data,4)
maxU=max(U); %最大隶属度
index1 = find(U(1,:) == maxU) %找到属于第一类的点
index2 = find(U(2,:) == maxU) %找到属于第二类的点
index3 = find(U(3,:) == maxU) %找到属于第三类的点
index4 = find(U(4,:) == maxU) %找到属于第四类的点
%为了提高图形的区分度,添加如下命令:
line(data(index1,1),data(index1,2),data(index1,3),'linestyle','none','marker','*','color','g');
line(data(index2,1),data(index2,2),data(index2,3),'linestyle','none','marker','*','color','r');
line(data(index3,1),data(index3,2),data(index3,3),'linestyle','none','marker','+','color','b');
line(data(index4,1),data(index4,2),data(index4,3),'linestyle','none','marker','+','color','y');
clear all;
data=[1739.94 1675.15 2395.96
373.3 3087.05 2429.47
1756.77 1652 1514.98
864.45 1647.31 2665.9
222.85 3059.54 2002.33
877.88 2031.66 3071.18
1803.58 1583.12 2163.05
2352.12 2557.04 1411.53
401.3 3259.94 2150.98
363.34 3477.95 2462.86
1571.17 1731.04 1735.33
104.8 3389.83 2421.83
499.85 3305.75 2196.22
2297.28 3340.14 535.62
2092.62 3177.21 584.32
1418.79 1775.89 2772.9
1845.59 1918.81 2226.49
2205.36 3243.74 1202.69
2949.16 3244.44 662.42
1692.62 1867.5 2108.97
1680.67 1575.78 1725.1
2802.88 3017.11 1984.98
172.78 3084.49 2328.65
2063.54 3199.76 1257.21
1449.58 1641.58 3405.12
1651.52 1713.28 1570.38
341.59 3076.62 2438.63
291.02 3095.68 2088.95
237.63 3077.78 2251.96
1702.8 1639.79 2068.74
1877.93 1860.96 1975.3
867.81 2334.68 2535.1
1831.49 1713.11 1604.68
460.69 3274.77 2172.99
2374.98 3346.98 975.31
2271.89 3482.97 946.7
1783.64 1597.99 2261.31
198.83 3250.45 2445.08
1494.63 2072.59 2550.51
1597.03 1921.52 2126.76
1598.93 1921.08 1623.33
1243.13 1814.07 3441.07
2336.31 2640.26 1599.63
354 3300.12 2373.61
2144.47 2501.62 591.51
426.31 3105.29 2057.8
1507.13 1556.89 1954.51
343.07 3271.72 2036.94
2201.94 3196.22 935.53
2232.43 3077.87 1298.87
1580.1 1752.07 2463.04
1962.4 1594.97 1835.95
1495.18 1957.44 3498.02
1125.17 1594.39 2937.73
24.22 3447.31 2145.01
1269.07 1910.72 2701.97
1802.07 1725.81 1966.35
1817.36 1927.4 2328.79
1860.45 1782.88 1875.13];
[center,U,obj_fcn] = fcm(data,4);
plot3(data(:,1),data(:,2),data(:,3),'o');
grid;
maxU=max(U);
index1 = find(U(1,:) == maxU)
index2 = find(U(2,:) == maxU)
index3 = find(U(3,:) == maxU)
index4 = find(U(4,:) == maxU)
line(data(index1,1),data(index1,2),data(index1,3),'linestyle','none','marker','*','color','g');
line(data(index2,1),data(index2,2),data(index2,3),'linestyle','none','marker','*','color','r');
line(data(index3,1),data(index3,2),data(index3,3),'linestyle','none','marker','+','color','b');
line(data(index4,1),data(index4,2),data(index4,3),'linestyle','none','marker','+','color','y');
title('模糊C均值聚类分析图');
xlabel('第一特征坐标'); ylabel('第二特征坐标'); zlabel('第三特征坐标');
进行模糊C均值聚类分析的数据如下:在迭代次数为1时,目标函数值为29331038.99996;随着迭代次数的增加(从第1次到第2次),目标函数值显著下降至22324822.81624;随后呈现稳定下降趋势直至收敛状态(最终目标函数值降至7416839.41101)。
分类情况:
index1 = 8 14 15 18 19 22 24 35 36 43 45 49 50
index2 =4 6 16 25 32 39 42 53 54 56
index3 =1 3 7 11 17 20 21 26 30 31 33 37 40 41 47 51 52 57 58 59
index4 =2 5 9 10 12 13 23 27 28 29 34 38 44 46 48 55

(三) 总结:
模糊聚类分析作为一种无监督机器学习中的核心方法之一被广泛应用于数据分析领域。它是基于模糊数学理论对数据进行分析并建立模型的方法**(旨在构建样本类别归属的不确定性描述)。这种方法能够较为客观地反映现实世界的情况,并已在模式识别、图像分割等领域的研究中得到了广泛应用(具有重要的理论与实际应用价值)。随着应用领域的深入发展(特别是模糊聚类算法的研究不断取得新的进展)**其研究方向也在不断拓展与完善中。
