模糊C均值聚类法
1模糊C均值聚类法
很多分类问题中,分类对象之间没有明确的界限,往往具有这个类的特点,也有另一个类的特点。例如高与矮没有明确的界限,多高的人才是高人,可能每个人都有自己的判断。这类的问题,如果用传统的聚类方法(K均值聚类或系统聚类法)进行分类,把每个待分类的对象严格地划分到某个类中,这也存在一定的不合理性。这就需要使用模糊聚类进行分析。
模糊聚类就是将n个样品划分为 c 类,记V={v1,v2,.....,vc}为 c 个类的聚类中心,在模糊划分中,每一个样品不是严格的划分为某一类,而是以一定的隶属度属于某一类,根据隶属度来确定样品的归属。
2 模糊C均值聚类法的MATLAB函数
MATLAB模糊逻辑工具箱中提供了模糊C均值聚类的函数:fcm函数,它的调用格式如下:
[center,U,obj_fcn]=fcm(data,cluster_n)
[center,U,obj_fcn]=fcm(data,cluster_n,options)
输入参数data是用于聚类的数据集,它是一个矩阵,每行对应一个样品(或观测),每列对应一个变量。cluster_n是一个正整数,表示类的个数。options是一个包含4个元素的向量,用来设置迭代的参数。options的第1个元素是隶属度的幂指数,其值应大于1,默认值为2;第2个参数是最大迭代次数,默认值为100;第3个参数是目标函数的终止容限,默认值为10^-5;第4个参数用来控制是否显示中间迭代过程,若取值为0,表示不显示中间迭代,否则显示。
输出参数center是cluster_n个类重心坐标矩阵,它是cluster_n行,p列的矩阵。U是cluster_n行,n列的隶属度矩阵,它的第i行第k列元素uik表示第k个样品xk属于第i类的隶属度,可以根据U中每列元素的取值来判定每个样品的归属。obj_fcn是目标函数值向量,它的第i个元素表示第i步迭代的目标函数值,它所包含的元素的总数是实际迭代的总步数。
.3 模糊C均值聚类示例
下表中列出了我国31个省的12个月的月平均气温数据,根据这些观测数据,利用模糊C均值聚类法面对各地区进行聚类。
%读取数据,并进行标准化变换
[xdata,textdata] = xlsread('月平均气温.xls');
%提取元胞数组textdata第一列的第4行至最后一行,即城市名称数据
city = textdata(4:end,1);
%调用zscore函数将平均气温数据矩阵xdata进行标准话变换
X = zscore(xdata);
%进行模糊C均值聚类
%设置幂指数为3,最大迭代次数200,目标函数的终止容限为1e-6,不显示中间迭代过程
options = [3, 200, 1e-6, 0];
%调用fcm函数进行模糊C均值聚类,返回类中心坐标矩阵center
%隶属度矩阵U,目标函数值obj_fcn
[center,U,obj_fcn] = fcm(X,3,options)
center =
-1.2112 -1.1743 -1.2768 -1.1717 -0.9853 -0.9953 -0.8856 -0.8888 -1.0991 -1.1692 -1.1928 -1.2039
-0.0068 0.0092 0.1915 0.1204 0.2096 0.4829 0.1346 0.0285 0.0972 0.1299 0.0144 -0.0330
0.7462 0.6674 0.6982 0.7619 0.7274 0.5940 0.9069 0.9482 0.8845 0.8567 0.8362 0.8068
U =
Columns 1 through 12
0.2075 0.2273 0.1149 0.4072 0.8180 0.7312 0.7023 0.6367 0.1059 0.1125 0.0866 0.1089
0.5858 0.5614 0.7116 0.3973 0.1115 0.1628 0.1752 0.2106 0.3007 0.4368 0.2423 0.4463
0.2067 0.2113 0.1734 0.1956 0.0705 0.1060 0.1226 0.1527 0.5934 0.4507 0.6711 0.4448
Columns 13 through 24
0.1085 0.0553 0.0823 0.0965 0.0967 0.0705 0.1555 0.1461 0.1903 0.1003 0.1296 0.2481
0.2372 0.1516 0.7636 0.6941 0.2723 0.1988 0.2914 0.2933 0.3197 0.2330 0.5028 0.4730
0.6543 0.7931 0.1541 0.2094 0.6310 0.7307 0.5531 0.5605 0.4900 0.6668 0.3676 0.2789
Columns 25 through 31
0.2735 0.4782 0.1075 0.7181 0.5477 0.4988 0.6758
0.4002 0.2990 0.7092 0.1692 0.2574 0.3273 0.1986
0.3263 0.2229 0.1833 0.1127 0.1949 0.1739 0.1256
obj_fcn =
69.7755
36.6628
32.6049
29.5032
28.0235
27.6362
27.5577
27.5379
27.5316
27.5292
27.5282
27.5278
27.5276
27.5275
27.5275
27.5275
27.5274
27.5274
27.5274
27.5274
返回的类中心坐标矩阵center是一个3x12的矩阵,每一行是一个雷的类中心坐标。隶属度矩阵U是一个3x31的矩阵,每一列是一个城市属于3个类的隶属度,例如U的第一列元素分别为0.2705,0.5858,和0.2067,表示北京属于第1类的隶属度为0.2075,属于第2类的隶属度为0.5858,属于第3类的隶属度为0.2067,由于北京属于第2类的隶属度比其他两个都大,可把北京归为第2类,其他城市的分类与之类似。返回的目标函数值obj_fcn是一个包含21个元素的列向量,说明求解过程中经过了21步迭代。
查看聚类结果
由fcm函数返回的结果还不能很直观地看出每一个城市所属的类,下面通过查找每一个类中所包含的城市的序号(即查找隶属度矩阵U中的每一列中最大值的列标),来确定每个类中含有哪些城市
%查看聚类结果
%max函数返回每列的最大值,U(1,:)返回的是每列的第一个元素
id1 = find(U(1,:) == max(U));%如果列的最大值等于该列的第一个元素,则为第一类,返回的是该元素的列标,即为城市的序号
id2 = find(U(2,:) == max(U));%同上
id3 = find(U(3,:) == max(U));
city(id1)
city(id2)
city(id3)
ans =
' 太 原'
' 呼和浩特'
' 沈 阳'
' 长 春'
' 哈 尔 滨'
' 拉 萨'
' 兰 州'
' 西 宁'
' 银 川'
' 乌鲁木齐'
ans =
' 北 京'
' 天 津'
' 石 家 庄'
' 合 肥'
' 济 南'
' 郑 州'
' 温 州'
' 贵 阳'
' 昆 明'
' 西 安'
ans =
' 上 海'
' 南 京'
' 杭 州'
' 福 州'
' 南 昌'
' 武 汉'
' 长 沙'
' 广 州'
' 南 宁'
' 海 口'
' 重 庆'
注意:由于fcm函数通过生成随机数的方式确定隶属度矩阵的初值,因此调用fcm函数进行聚类时,每次聚类的结果可能会有细微差别(整体聚类结果相同,只是类的排序可能不同)。