2023年8月2日发(作者:)

k-means聚类算法的研究

1.k-means算法简介

1.1 k-means算法描述

给定n个对象的数据集D和要生成的簇数目k,划分算法将对象组织划分为k个簇(k<=n),这些簇的形成旨在优化一个目标准则。例如,基于距离的差异性函数,使得根据数据集的属性,在同一个簇中的对象是“相似的”,而不同簇中的对象是“相异的”。划分聚类算法需要预先指定簇数目或簇中心,通过反复迭代运算,逐步降低目标函数的误差值,当目标函数收敛时,得到最终聚类结果。这类方法分为基于质心的(Centroid-based)划分方法和基于中心的(Medoid-based)划分方法,而基于质心的划分方法是研究最多的算法,其中k-means算法是最具代表和知名的。

k-means算法是1967年由MacQueen首次提出的一种经典算法,经常用于数据挖掘和模式识别中,是一种无监督式的学习算法,其使用目的是对几何进行等价类的划分,即对一组具有相同数据结构的记录按某种分类准则进行分类,以获取若干个同类记录集。k-means聚类是近年来数据挖掘学科的一个研究热点和重点,这主要是因为它广泛应用于地球科学、信息技术、决策科学、医学、行为学和商业智能等领域。迄今为止,很多聚类任务都选择该算法。k-means算法是应用最为广泛的聚类算法。该算法以类中各样本的加权均值(成为质心)代表该类,只用于数字属性数据的聚类,算法有很清晰的几何和统计意义,但抗干扰性较差。通常以各种样本与其质心欧几里德距离总和作为目标函数,也可将目标函数修改为各类中任意两点间欧几里德距离总和,这样既考虑了类的分散度也考虑了类的紧致度。k-means算法是聚类分析中基于原型的划分聚类的应用算法。如果将目标函数看成分布归一化混合模型的似然率对数,k-means算法就可以看成概率模型算法的推广。

k-means算法基本思想:

(1) 随机的选K个点作为聚类中心;

(2) 划分剩余的点;

(3) 迭代过程需要一个收敛准则,此次采用平均误差准则。

(4) 求质心(作为中心);

(5) 不断求质心,直到不再发生变化时,就得到最终的聚类结果。

k-means聚类算法是一种广泛应用的聚类算法,计算速度快,资源消耗少,但是k-means算法与初始选择有关系,初始聚类中心选择的随机性决定了算法的有效性和聚 类的精度,初始选择不一样,结果也不一样。其缺陷是会陷于局部最优。

1.2 k-means算法实现步骤

k-means聚类算法的处理流程如下:首先,随机选择k个对象,每个对象代表一个簇的初始均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它指派到最近(或最相似)的簇,然后计算每个簇的新均值,得到更新后的簇中心;不断重复,直到准则函数收敛。通常,采用平方误差准则,即对于每个簇中的每个对象,求对象到其中心距离的平方和,这个准则试图生成的k个结果簇尽可能地紧凑和独立。

1.2.1 k-means聚类算法的形式化描述

算法:k-means

输入:聚类个数k,以及包含n个数据对象的数据库D

输出:满足方差最小标准的k个聚类

处理流程:

Step1 从n个数据对象任意选择k个对象作为初始聚类中心;

Step2 根据簇中对象的平均值,将每个对象重新赋给最类似的簇;

Step3 更新簇的平均值,即计算每个簇中对象的平均值;

Step4 循环Step2到Step3直到每个聚类不再发生变化为止。

1.2.2 k-means聚类算法的具体步骤

1) Function k-means()

2) 输入:包含n个对象的数据集及簇的数目

3) 输出:k个簇的集合

4) 初始化k个簇中心{w1,w2,…,wk},其中wj= il,j ∈{1,2,…,k},l ∈{1,2,…,n}

5) 使每一个聚类Cj与簇中心wj中相对应

6) repeat

7) for每一个输入向量il,其中l ∈{1,2,…,n } do

8) 将il分配给最近的簇中心wj*所属的聚类Cj*

(即|il—wj*|≦|il—wj|),j ∈(1,2,…,k))

9) for 每一个聚类Cj,其中j ∈{1,2,…,k}

10) 将簇中心更新为当前的Cj中所有样本的中心点,即wj11) 计算准则函数E

ilcjil|Cj| 12) Until E不再明显地改变或者聚类的成员不再变化

1.2.3 相关定义

(1)两个数据对象间的距离:

①明氏距离(Minkowski Distance)

d(xi,xj)(|xik-xjk|q)1/qk1p (公式1)

这里的xi=(

xi1,xi2,…,xip)和xj=(

xj1,xj2,…,xjp)是两个p维的数据对象并且 i≠j。

②欧式距离(Euclidean Distance)

当明氏距离中q=2时,公式1即欧式距离。

d(xi,xj)(|xik-xjk|2)1/2k1p (公式2)

③马氏距离(Mahalanobis Distance)

(ij)pp (公式3)

1n(xki-xi)(xkj-xj),i,j=1,2…,p。如果∑-1存在,则马氏距离为 其中ijn-1k1

2dM(xi,xj)(xi,xj)T1(xi,xj) (公式4)

④兰式距离(Canberra Distance):

1p|xik-xjk|dL(xi,xj) (公式5)

pk1xikxjk(2)准则函数E

对于K-means算法,通常使用准则函数E,也就是误差平方和(Sum of Squared Error,SSE)作为度量聚类质量的目标函数。

Ed2(Ci,x) (公式6)

i1xCik其中,d( )表示两个对象之间的距离,可以利用明氏、欧式、马氏或兰氏距离求得。

对于相同的k值,更小的SSE说明簇中对象越集中。对于不同的k值,越大的k值应该越小的SSE。

2.k-means算法应用实例

k-means聚类广泛应用于地球科学、信息技术、决策科学、医学、行为学和商业智 能等领域。现以其在气象、遥感两个方面的应用为例,使用MATLAB语言编程,实现k-means算法的应用。

2.1 k-means算法应用实例(一)

以我国主要城市2008年1~4月份的平均气温数据为基础,使用MATLAB语言编程,实现k-means算法。

2.1.1 算法代码

(1)k-means算法主程序

k=3;

x =[ -3.0 0.6 9.1 15.8

-3.6 -0.7 8.6 15.8

-2.0 2.5 10.6 16.3

-5.5 -3.3 7.1 13.1

-12.1 -9.3 3.4 11.4

-12.6 -7.9 3.8 12.2

-15.6 -9.4 3.0 12.1

-17.6 -10.5 2.7 11.3

4.2 4.0 11.4 15.9

1.5 2.5 11.3 15.6

3.7 3.9 12.7 17.1

1.0 2.7 12.5 16.8

11.0 9.1 15.3 19.3

3.5 5.5 14.6 18.7

-2.0 1.0 10.3 16.3

-0.7 2.8 12.1 16.9

1.2 4.9 14.4 18.5

2.3 5.5 15.2 18.9

12.8 11.6 20.1 23.2

9.4 10.4 19.1 22.9

16.9 13.3 20.9 25.3

6.2 7.3 15.5 19.0

3.7 5.4 13.4 17.2

1.0 2.2 11.8 15.7

10.7 8.5 13.7 18.0

1.5 1.4 5.6 10.1

-1.7 1.8 12.5 16.4

-6.6 -4.1 9.1 13.8

-9.6 -7.9 3.4 8.3

-10.2 -7.7 7.3 13.4

-15.6 -9.6 5.2 11.1];

[n,d] = size(x);

bn=round(n/k*rand);%第一个随机数在前1/K的范围内

nc=[x(bn,:);x(2*bn,:);x(3*bn,:)];%初始聚类中心

[cid,nr,centers] = kmeans(x,k,nc)%调用kmeans函数 for i=1:length(x),

if cid(i)==1,

plot(x(i,1),x(i,2),'r*') % 显示第一类

hold on

else

if cid(i)==2,

plot(x(i,1),x(i,2),'b*') %显示第二类

hold on

else

if cid(i)==3,

plot(x(i,1),x(i,2),'g*') %显示第三类

hold on

end

end

end

end

strt=['红色*为第一类;蓝色*为第二类;绿色*为第三类' ];

text(-4,-3.6,strt);

(2)kmeans函数如下:

%BasicKMeans.m主类

function [cid,nr,centers] = kmeans(x,k,nc)

[n,d] = size(x);

% 设置cid为分类结果显示矩阵

cid = zeros(1,n);

% Make this different to get the loop started.

oldcid = ones(1,n);

% The number in each cluster.

nr = zeros(1,k);

% Set up maximum number of iterations.

maxgn= 100;

iter = 1;

while iter < maxgn

%计算每个数据到聚类中心的距离

for i = 1:n

dist = sum((repmat(x(i,:),k,1)-nc).^2,2);

[m,ind] = min(dist); % 将当前聚类结果存入cid中

cid(i) = ind;

end

for i = 1:k

%找到每一类的所有数据,计算他们的平均值,作为下次计算的聚类中心

ind = find(cid==i);

nc(i,:) = mean(x(ind,:));

% 统计每一类的数据个数

nr(i) = length(ind);

end

iter = iter + 1; end

% Now check each observation to see if the error can be minimized some more.

% Loop through all points.

maxiter = 2;

iter = 1;

move = 1;

while iter < maxiter & move ~= 0

move = 0;

% 对所有的数据进行再次判断,寻求最佳聚类结果

for i = 1:n

dist = sum((repmat(x(i,:),k,1)-nc).^2,2);

r = cid(i); % 将当前数据属于的类给r

dadj = nr./(nr+1).*dist'; % 计算调整后的距离

[m,ind] = min(dadj); % 早到该数据距哪个聚类中心最近

if ind ~= r % 如果不等则聚类中心移动

cid(i) = ind;%将新的聚类结果送给cid

ic = find(cid == ind);%重新计算调整当前类别的聚类中心

nc(ind,:) = mean(x(ic,:));

move = 1;

end

end

iter = iter+1;

end

centers = nc;

if move == 0

disp('No points were moved after the initial clustering procedure.')

else

disp('Some points were moved after the initial clustering procedure.')

end

2.1.2 使用数据

城 市 1月 2月 3月 4月

北 京 -3 0.6 9.1 15.8

天 津 -3.6 -0.7 8.6 15.8

石 家 庄 -2 2.5 10.6 16.3

太 原 -5.5 -3.3 7.1 13.1

呼和浩特 -12.1 -9.3 3.4 11.4

沈 阳 -12.6 -7.9 3.8 12.2

长 春 -15.6 -9.4 3 12.1

哈 尔 滨 -17.6 -10.5 2.7 11.3

上 海 4.2 4 11.4 15.9

南 京 1.5 2.5 11.3 15.6

杭 州 3.7 3.9 12.7 17.1

合 肥 1 2.7 12.5 16.8

福 州 11 9.1 15.3 19.3 南 昌 3.5 5.5 14.6 18.7

济 南 -2 1 10.3 16.3

郑 州 -0.7 2.8 12.1 16.9

武 汉 1.2 4.9 14.4 18.5

长 沙 2.3 5.5 15.2 18.9

广 州 12.8 11.6 20.1 23.2

南 宁 9.4 10.4 19.1 22.9

海 口 16.9 13.3 20.9 25.3

重 庆 6.2 7.3 15.5 19

成 都 3.7 5.4 13.4 17.2

贵 阳 1 2.2 11.8 15.7

昆 明 10.7 8.5 13.7 18

拉 萨 1.5 1.4 5.6 10.1

西 安 -1.7 1.8 12.5 16.4

兰 州 -6.6 -4.1 9.1 13.8

西 宁 -9.6 -7.9 3.4 8.3

银 川 -10.2 -7.7 7.3 13.4

乌鲁木齐 -15.6 -9.6 5.2 11.1

2.1.3 分类效果及结果分析

(1)聚类过程

No points were moved after the initial clustering procedure.

cid =

Columns 1 through 18

2 2 2 1 1 1 1 1 2 2 2 2 3 2

2 2 2 2

Columns 19 through 31

3 3 3 3 2 2 3 2 2 1 1 1 1

nr =

9 16 6

centers =

-11.7111 -7.7444 5.0000 11.8556

0.6625 2.8750 11.6313 16.3750

11.1667 10.0333 17.4333 21.2833 (2)分类效果图

图1 案例一效果图

(3)分类结果分析

在本案例中主要是对全国主要城市的气温进行k-means聚类分析,从而总结出不同地区相同时间段内气温变化的相似性和差异性。但由于数据的原因,效果不是很明显。

综合海陆位置、海拔以及经纬度等多种地理学因素,可以得出:第一类红色代表北纬40°以北地区,第二类蓝色代表北纬25°~40°之间的地区,第三类绿色代表北纬25°以南地区。

2.2 k-means算法应用实例(二)

此案例主要是k-means算法在遥感图像中的应用:将某一区域的遥感图像波段信息进行标准化处理,标准化的方法为平均值标准化,即(某一波段像元灰度值减去该波段像元灰度平均值)/该波段像元灰度平均值。

2.2.1 算法代码

(1)k-means算法主程序

%k-means算法主程序

k=4;

x =[ 1.2126 2.1338 0.5115 0.2044

-0.9316 0.7634 0.0125 -0.2752

-2.9593 0.1813 -0.8833 0.8505

3.1104 -2.5393 -0.0588 0.1808

-3.1141 -0.1244 -0.6811 0.9891

-3.2008 0.0024 -1.2901 0.9748 -1.0777 1.1438 0.1996 0.0139

-2.7213 -0.1909 0.1184 0.1013

-1.1467 1.3820 0.1427 -0.2239

1.1497 1.9414 -0.3035 0.3464

2.6993 -2.2556 0.1637 -0.0139

-3.0311 0.1417 0.0888 0.1791

-2.8403 -0.1809 -0.0965 0.0817

1.0118 2.0372 0.1638 -0.0349

-0.8968 1.0260 -0.1013 0.2369

1.1112 1.8802 -0.0291 -0.1506

1.1907 2.2041 -0.1060 0.2167

-1.0114 0.8029 -0.1317 0.0153

-3.1715 0.1041 -0.3338 0.0321

0.9718 1.9634 0.0305 -0.3259

-1.0377 0.8889 -0.2834 0.2301

-0.8989 1.0185 -0.0289 0.0213

-2.9815 -0.4798 0.2245 0.3085

-0.8576 0.9231 -0.2752 -0.0091

-3.1356 0.0026 -1.2138 0.7733

3.4470 -2.2418 0.2014 -0.1556

2.9143 -1.7951 0.1992 -0.2146

3.4961 -2.4969 -0.0121 0.1315

-2.9341 -0.1071 -0.7712 0.8911

-2.8105 -0.0884 -0.0287 -0.1279

3.1006 -2.0677 -0.2002 -0.1303

0.8209 2.1724 0.1548 0.3516

-2.8500 0.3196 0.1359 -0.1179

-2.8679 0.1365 -0.5702 0.7626

-2.8245 -0.1312 0.0881 -0.1305

-0.8322 1.3014 -0.3837 0.2400

-2.6063 0.1431 0.1880 0.0487

-3.1341 -0.0854 -0.0359 -0.2080

0.6893 2.0854 -0.3250 -0.1007

1.0894 1.7271 -0.0176 0.6553

-2.9851 -0.0113 0.0666 -0.0802

1.0371 2.2724 0.1044 0.3982

-2.8032 -0.2737 -0.7391 1.0277

-2.6856 0.0619 -1.1066 1.0485

-2.9445 -0.1602 -0.0019 0.0093

1.2004 2.1302 -0.1650 0.3413

3.2505 -1.9279 0.4462 -0.2405

-1.2080 0.8222 0.1671 0.1576

-2.8274 0.1515 -0.9636 1.0675

2.8190 -1.8626 0.2702 0.0026

1.0507 1.7776 -0.1421 0.0999

-2.8946 0.1446 -0.1645 0.3071 -1.0105 1.0973 0.0241 0.1628

-2.9138 -0.3404 0.0627 0.1286

-3.0646 -0.0008 0.3819 -0.1541

1.2531 1.9830 -0.0774 0.2413

1.1486 2.0440 -0.0582 -0.0650

-3.1401 -0.1447 -0.6580 0.9562

-2.9591 0.1598 -0.6581 1.1937

-2.9219 -0.3637 -0.1538 -0.2085

2.8948 -2.2745 0.2332 -0.0312

-3.2972 -0.0219 -0.0288 -0.1436

-1.2737 0.7648 0.0643 0.0858

-1.0690 0.8108 -0.2723 0.3231

-0.5908 0.7508 -0.5456 0.0190

0.5808 2.0573 -0.1658 0.1709

2.8227 -2.2461 0.2255 -0.3684

0.6174 1.7654 -0.3999 0.4125

3.2587 -1.9310 0.2021 0.0800

1.0999 1.8852 -0.0475 -0.0585

-2.7395 0.2585 -0.8441 0.9987

-1.2223 1.0542 -0.2480 -0.2795

-2.9212 -0.0605 -0.0259 0.2591

3.1598 -2.2631 0.1746 0.1485

0.8476 1.8760 -0.2894 -0.0354

2.9205 -2.2418 0.4137 -0.2499

2.7656 -2.1768 0.0719 -0.1848

-0.8698 1.0249 -0.2084 -0.0008

-1.1444 0.7787 -0.4958 0.3676

-1.0711 1.0450 -0.0477 -0.4030

0.5350 1.8110 -0.0377 0.1622

0.9076 1.8845 -0.1121 0.5700

-2.7887 -0.2119 0.0566 0.0120

-1.2567 0.9274 0.1104 0.1581

-2.9946 -0.2086 -0.8169 0.6662

1.0536 1.9818 -0.0631 0.2581

-2.8465 -0.2222 0.2745 0.1997

-2.8516 0.1649 -0.7566 0.8616

-3.2470 0.0770 0.1173 -0.1092

-2.9322 -0.0631 -0.0062 -0.0511

-2.7919 0.0438 -0.1935 -0.5023

0.9894 1.9475 -0.0146 -0.0390

-2.9659 -0.1300 0.1144 0.3410

-2.7322 -0.0427 -1.0758 0.9718

-1.4852 0.8592 -0.0503 -0.1373

2.8845 -2.1465 -0.0533 -0.1044

-3.1470 0.0536 0.1073 0.3323

2.9423 -2.1572 0.0505 0.1180 -3.0683 0.3434 -0.6563 0.8960

1.3215 2.0951 -0.1557 0.3994

-0.7681 1.2075 -0.2781 0.2372

-0.6964 1.2360 -0.3342 0.1662

-0.6382 0.8204 -0.2587 0.3344

-3.0233 -0.1496 -0.2607 -0.0400

-0.8952 0.9872 0.0019 0.3138

-0.8172 0.6814 -0.0691 0.1009

-3.3032 0.0571 -0.0243 -0.1405

0.7810 1.9013 -0.3996 0.7374

-0.9030 0.8646 -0.1498 0.1112

-0.8461 0.9261 -0.1295 -0.0727

2.8182 -2.0818 -0.1430 -0.0547

2.9295 -2.3846 -0.0244 -0.1400

1.0587 2.2227 -0.1250 0.0957

3.0755 -1.7365 -0.0511 0.1500

-1.3076 0.8791 -0.3720 0.0331

-2.8252 -0.0366 -0.6790 0.7374

-2.6551 -0.1875 0.3222 0.0483

-2.9659 -0.1585 0.4013 -0.1402

-3.2859 -0.1546 0.0104 -0.1781

-0.6679 1.1999 0.1396 -0.3195

-1.0205 1.2226 0.1850 0.0050

-3.0091 -0.0186 -0.9111 0.9663

-3.0339 0.1377 -0.9662 1.0664

0.8952 1.9594 -0.3221 0.3579

-2.8481 0.1963 -0.1428 0.0382

1.0796 2.1353 -0.0792 0.6491

-0.8732 0.8985 -0.0049 0.0068

1.0620 2.1478 -0.1275 0.3553

3.4509 -1.9975 0.1285 -0.1575

-3.2280 -0.0640 -1.1513 0.8235

-0.6654 0.9402 0.0577 -0.0175

-3.2100 0.2762 -0.1053 0.0626

3.0793 -2.0043 0.2948 0.0411

1.3596 1.9481 -0.0167 0.3958

-3.1267 0.1801 0.2228 0.1179

-0.7979 0.9892 -0.2673 0.4734

2.5580 -1.7623 -0.1049 -0.0521

-0.9172 1.0621 -0.0826 0.1501

-0.7817 1.1658 0.1922 0.0803

3.1747 -2.1442 0.1472 -0.3411

2.8476 -1.8056 -0.0680 0.1536

-0.6175 1.4349 -0.1970 -0.1085

0.7308 1.9656 0.2602 0.2801

-1.0310 1.0553 -0.2928 -0.1647 -2.9251 -0.2095 0.0582 -0.1813

-0.9827 1.2720 -0.2225 0.2563

-1.0830 1.1158 -0.0405 -0.1181

-2.8744 0.0195 -0.3811 0.1455

3.1663 -1.9241 0.0455 0.1684

-1.0734 0.7681 -0.4725 -0.1976];

[n,d] = size(x);

bn=round(n/k*rand);%第一个随机数在前1/K的范围内

nc=[x(bn,:);x(2*bn,:);x(3*bn,:);x(4*bn,:)];%初始聚类中心

[cid,nr,centers] = kmeans(x,k,nc)%调用kmeans函数

for i=1:150,

if cid(i)==1,

plot(x(i,1),x(i,2),'r*') % 显示第一类

hold on

else

if cid(i)==2,

plot(x(i,1),x(i,2),'b*') %显示第二类

hold on

else

if cid(i)==3,

plot(x(i,1),x(i,2),'g*') %显示第三类

hold on

else

if cid(i)==4,

plot(x(i,1),x(i,2),'k*') %显示第四类

hold on

end

end

end

end

end

strt=['红色*为第一类;蓝色*为第二类;绿色*为第三类;黑色*为第四类' ];

text(-4,-3.6,strt);

(2)kmeans函数

kmeans函数同案例(一)

2.2.2 使用数据

(由于数据太多,就不在此表述,数据已经在程序中表述)

2.2.3 分类效果图及结果分析

(1)聚类过程

No points were moved after the initial clustering procedure.

cid = Columns 1 through 18

1 4 2 3 2 2 4 2 4 1 3 2 2 1

4 1 1 4

Columns 19 through 36

2 1 4 4 2 4 2 3 3 3 2 2 3 1

2 2 2 4

Columns 37 through 54

2 2 1 1 2 1 2 2 2 1 3 4 2 3

1 2 4 2

Columns 55 through 72

2 1 1 2 2 2 3 2 4 4 4 1 3 1

3 1 2 4

Columns 73 through 90

2 3 1 3 3 4 4 4 1 1 2 4 2 1

2 2 2 2

Columns 91 through 108

2 1 2 2 4 3 2 3 2 1 4 4 4 2

4 4 2 1

Columns 109 through 126

4 4 3 3 1 3 4 2 2 2 2 4 4 2

2 1 2 1

Columns 127 through 144

4 1 3 2 4 2 3 1 2 4 3 4 4 3

3 4 1 4

Columns 145 through 150

2 4 4 2 3 4

nr =

30 55 25 40

centers = 0.9952 1.9979 -0.0785 0.2296

-2.9629 -0.0230 -0.2970 0.3411

3.0234 -2.0986 0.1021 -0.0506

-0.9569 0.9978 -0.1237 0.0493

(2)分类效果图

图2 案例二效果图

(3)分类结果分析

k-means算法在本案例中主要是对遥感图像像元灰度值进行聚类分析,从而确定地物类型,最后根据像元灰度值的特定规律,结合地理学知识,对遥感图像进行解译。

综合遥感波段知识,可以得出:第一类红色的代表居民地,第二类蓝色代表植被,第三类绿色代表水体,第四类黑色的代表裸岩。 【参考文献】

[1] 陈晓春. 基于K-Means和EM算法的聚类分析[J].福建电脑,2009,2:79-80.

[2] 步媛媛,关忠仁. 基于K-means聚类算法的研究[J]. 西南民族大学学报,2009,35(1):198-200.

[3] 陈寿文,李明东. 基于面向对象思想K-Means算法实现[J]. 滁州学院学报,2008,10(3):42-44.

[4] 黄振华,向阳,张波,王栋,刘啸岭. 一种进行K-Means聚类的有效方法[J]. 模式识别与人工智能,2010,23(4):516-521.

[5] 陈燕.数据挖掘技术与应用[M]. 北京:清华大学出版社,2011.

[6] 蒋盛益,李霞,郑琪.数据挖掘原理与实践[M]. 北京:电子工业出版社,2011.

[7] 邵峰晶,于忠清,王金龙,孙仁诚. 数据挖掘原理与算法[M]. 北京:科学出版社,2011.

2023年8月2日发(作者:)

k-means聚类算法的研究

1.k-means算法简介

1.1 k-means算法描述

给定n个对象的数据集D和要生成的簇数目k,划分算法将对象组织划分为k个簇(k<=n),这些簇的形成旨在优化一个目标准则。例如,基于距离的差异性函数,使得根据数据集的属性,在同一个簇中的对象是“相似的”,而不同簇中的对象是“相异的”。划分聚类算法需要预先指定簇数目或簇中心,通过反复迭代运算,逐步降低目标函数的误差值,当目标函数收敛时,得到最终聚类结果。这类方法分为基于质心的(Centroid-based)划分方法和基于中心的(Medoid-based)划分方法,而基于质心的划分方法是研究最多的算法,其中k-means算法是最具代表和知名的。

k-means算法是1967年由MacQueen首次提出的一种经典算法,经常用于数据挖掘和模式识别中,是一种无监督式的学习算法,其使用目的是对几何进行等价类的划分,即对一组具有相同数据结构的记录按某种分类准则进行分类,以获取若干个同类记录集。k-means聚类是近年来数据挖掘学科的一个研究热点和重点,这主要是因为它广泛应用于地球科学、信息技术、决策科学、医学、行为学和商业智能等领域。迄今为止,很多聚类任务都选择该算法。k-means算法是应用最为广泛的聚类算法。该算法以类中各样本的加权均值(成为质心)代表该类,只用于数字属性数据的聚类,算法有很清晰的几何和统计意义,但抗干扰性较差。通常以各种样本与其质心欧几里德距离总和作为目标函数,也可将目标函数修改为各类中任意两点间欧几里德距离总和,这样既考虑了类的分散度也考虑了类的紧致度。k-means算法是聚类分析中基于原型的划分聚类的应用算法。如果将目标函数看成分布归一化混合模型的似然率对数,k-means算法就可以看成概率模型算法的推广。

k-means算法基本思想:

(1) 随机的选K个点作为聚类中心;

(2) 划分剩余的点;

(3) 迭代过程需要一个收敛准则,此次采用平均误差准则。

(4) 求质心(作为中心);

(5) 不断求质心,直到不再发生变化时,就得到最终的聚类结果。

k-means聚类算法是一种广泛应用的聚类算法,计算速度快,资源消耗少,但是k-means算法与初始选择有关系,初始聚类中心选择的随机性决定了算法的有效性和聚 类的精度,初始选择不一样,结果也不一样。其缺陷是会陷于局部最优。

1.2 k-means算法实现步骤

k-means聚类算法的处理流程如下:首先,随机选择k个对象,每个对象代表一个簇的初始均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它指派到最近(或最相似)的簇,然后计算每个簇的新均值,得到更新后的簇中心;不断重复,直到准则函数收敛。通常,采用平方误差准则,即对于每个簇中的每个对象,求对象到其中心距离的平方和,这个准则试图生成的k个结果簇尽可能地紧凑和独立。

1.2.1 k-means聚类算法的形式化描述

算法:k-means

输入:聚类个数k,以及包含n个数据对象的数据库D

输出:满足方差最小标准的k个聚类

处理流程:

Step1 从n个数据对象任意选择k个对象作为初始聚类中心;

Step2 根据簇中对象的平均值,将每个对象重新赋给最类似的簇;

Step3 更新簇的平均值,即计算每个簇中对象的平均值;

Step4 循环Step2到Step3直到每个聚类不再发生变化为止。

1.2.2 k-means聚类算法的具体步骤

1) Function k-means()

2) 输入:包含n个对象的数据集及簇的数目

3) 输出:k个簇的集合

4) 初始化k个簇中心{w1,w2,…,wk},其中wj= il,j ∈{1,2,…,k},l ∈{1,2,…,n}

5) 使每一个聚类Cj与簇中心wj中相对应

6) repeat

7) for每一个输入向量il,其中l ∈{1,2,…,n } do

8) 将il分配给最近的簇中心wj*所属的聚类Cj*

(即|il—wj*|≦|il—wj|),j ∈(1,2,…,k))

9) for 每一个聚类Cj,其中j ∈{1,2,…,k}

10) 将簇中心更新为当前的Cj中所有样本的中心点,即wj11) 计算准则函数E

ilcjil|Cj| 12) Until E不再明显地改变或者聚类的成员不再变化

1.2.3 相关定义

(1)两个数据对象间的距离:

①明氏距离(Minkowski Distance)

d(xi,xj)(|xik-xjk|q)1/qk1p (公式1)

这里的xi=(

xi1,xi2,…,xip)和xj=(

xj1,xj2,…,xjp)是两个p维的数据对象并且 i≠j。

②欧式距离(Euclidean Distance)

当明氏距离中q=2时,公式1即欧式距离。

d(xi,xj)(|xik-xjk|2)1/2k1p (公式2)

③马氏距离(Mahalanobis Distance)

(ij)pp (公式3)

1n(xki-xi)(xkj-xj),i,j=1,2…,p。如果∑-1存在,则马氏距离为 其中ijn-1k1

2dM(xi,xj)(xi,xj)T1(xi,xj) (公式4)

④兰式距离(Canberra Distance):

1p|xik-xjk|dL(xi,xj) (公式5)

pk1xikxjk(2)准则函数E

对于K-means算法,通常使用准则函数E,也就是误差平方和(Sum of Squared Error,SSE)作为度量聚类质量的目标函数。

Ed2(Ci,x) (公式6)

i1xCik其中,d( )表示两个对象之间的距离,可以利用明氏、欧式、马氏或兰氏距离求得。

对于相同的k值,更小的SSE说明簇中对象越集中。对于不同的k值,越大的k值应该越小的SSE。

2.k-means算法应用实例

k-means聚类广泛应用于地球科学、信息技术、决策科学、医学、行为学和商业智 能等领域。现以其在气象、遥感两个方面的应用为例,使用MATLAB语言编程,实现k-means算法的应用。

2.1 k-means算法应用实例(一)

以我国主要城市2008年1~4月份的平均气温数据为基础,使用MATLAB语言编程,实现k-means算法。

2.1.1 算法代码

(1)k-means算法主程序

k=3;

x =[ -3.0 0.6 9.1 15.8

-3.6 -0.7 8.6 15.8

-2.0 2.5 10.6 16.3

-5.5 -3.3 7.1 13.1

-12.1 -9.3 3.4 11.4

-12.6 -7.9 3.8 12.2

-15.6 -9.4 3.0 12.1

-17.6 -10.5 2.7 11.3

4.2 4.0 11.4 15.9

1.5 2.5 11.3 15.6

3.7 3.9 12.7 17.1

1.0 2.7 12.5 16.8

11.0 9.1 15.3 19.3

3.5 5.5 14.6 18.7

-2.0 1.0 10.3 16.3

-0.7 2.8 12.1 16.9

1.2 4.9 14.4 18.5

2.3 5.5 15.2 18.9

12.8 11.6 20.1 23.2

9.4 10.4 19.1 22.9

16.9 13.3 20.9 25.3

6.2 7.3 15.5 19.0

3.7 5.4 13.4 17.2

1.0 2.2 11.8 15.7

10.7 8.5 13.7 18.0

1.5 1.4 5.6 10.1

-1.7 1.8 12.5 16.4

-6.6 -4.1 9.1 13.8

-9.6 -7.9 3.4 8.3

-10.2 -7.7 7.3 13.4

-15.6 -9.6 5.2 11.1];

[n,d] = size(x);

bn=round(n/k*rand);%第一个随机数在前1/K的范围内

nc=[x(bn,:);x(2*bn,:);x(3*bn,:)];%初始聚类中心

[cid,nr,centers] = kmeans(x,k,nc)%调用kmeans函数 for i=1:length(x),

if cid(i)==1,

plot(x(i,1),x(i,2),'r*') % 显示第一类

hold on

else

if cid(i)==2,

plot(x(i,1),x(i,2),'b*') %显示第二类

hold on

else

if cid(i)==3,

plot(x(i,1),x(i,2),'g*') %显示第三类

hold on

end

end

end

end

strt=['红色*为第一类;蓝色*为第二类;绿色*为第三类' ];

text(-4,-3.6,strt);

(2)kmeans函数如下:

%BasicKMeans.m主类

function [cid,nr,centers] = kmeans(x,k,nc)

[n,d] = size(x);

% 设置cid为分类结果显示矩阵

cid = zeros(1,n);

% Make this different to get the loop started.

oldcid = ones(1,n);

% The number in each cluster.

nr = zeros(1,k);

% Set up maximum number of iterations.

maxgn= 100;

iter = 1;

while iter < maxgn

%计算每个数据到聚类中心的距离

for i = 1:n

dist = sum((repmat(x(i,:),k,1)-nc).^2,2);

[m,ind] = min(dist); % 将当前聚类结果存入cid中

cid(i) = ind;

end

for i = 1:k

%找到每一类的所有数据,计算他们的平均值,作为下次计算的聚类中心

ind = find(cid==i);

nc(i,:) = mean(x(ind,:));

% 统计每一类的数据个数

nr(i) = length(ind);

end

iter = iter + 1; end

% Now check each observation to see if the error can be minimized some more.

% Loop through all points.

maxiter = 2;

iter = 1;

move = 1;

while iter < maxiter & move ~= 0

move = 0;

% 对所有的数据进行再次判断,寻求最佳聚类结果

for i = 1:n

dist = sum((repmat(x(i,:),k,1)-nc).^2,2);

r = cid(i); % 将当前数据属于的类给r

dadj = nr./(nr+1).*dist'; % 计算调整后的距离

[m,ind] = min(dadj); % 早到该数据距哪个聚类中心最近

if ind ~= r % 如果不等则聚类中心移动

cid(i) = ind;%将新的聚类结果送给cid

ic = find(cid == ind);%重新计算调整当前类别的聚类中心

nc(ind,:) = mean(x(ic,:));

move = 1;

end

end

iter = iter+1;

end

centers = nc;

if move == 0

disp('No points were moved after the initial clustering procedure.')

else

disp('Some points were moved after the initial clustering procedure.')

end

2.1.2 使用数据

城 市 1月 2月 3月 4月

北 京 -3 0.6 9.1 15.8

天 津 -3.6 -0.7 8.6 15.8

石 家 庄 -2 2.5 10.6 16.3

太 原 -5.5 -3.3 7.1 13.1

呼和浩特 -12.1 -9.3 3.4 11.4

沈 阳 -12.6 -7.9 3.8 12.2

长 春 -15.6 -9.4 3 12.1

哈 尔 滨 -17.6 -10.5 2.7 11.3

上 海 4.2 4 11.4 15.9

南 京 1.5 2.5 11.3 15.6

杭 州 3.7 3.9 12.7 17.1

合 肥 1 2.7 12.5 16.8

福 州 11 9.1 15.3 19.3 南 昌 3.5 5.5 14.6 18.7

济 南 -2 1 10.3 16.3

郑 州 -0.7 2.8 12.1 16.9

武 汉 1.2 4.9 14.4 18.5

长 沙 2.3 5.5 15.2 18.9

广 州 12.8 11.6 20.1 23.2

南 宁 9.4 10.4 19.1 22.9

海 口 16.9 13.3 20.9 25.3

重 庆 6.2 7.3 15.5 19

成 都 3.7 5.4 13.4 17.2

贵 阳 1 2.2 11.8 15.7

昆 明 10.7 8.5 13.7 18

拉 萨 1.5 1.4 5.6 10.1

西 安 -1.7 1.8 12.5 16.4

兰 州 -6.6 -4.1 9.1 13.8

西 宁 -9.6 -7.9 3.4 8.3

银 川 -10.2 -7.7 7.3 13.4

乌鲁木齐 -15.6 -9.6 5.2 11.1

2.1.3 分类效果及结果分析

(1)聚类过程

No points were moved after the initial clustering procedure.

cid =

Columns 1 through 18

2 2 2 1 1 1 1 1 2 2 2 2 3 2

2 2 2 2

Columns 19 through 31

3 3 3 3 2 2 3 2 2 1 1 1 1

nr =

9 16 6

centers =

-11.7111 -7.7444 5.0000 11.8556

0.6625 2.8750 11.6313 16.3750

11.1667 10.0333 17.4333 21.2833 (2)分类效果图

图1 案例一效果图

(3)分类结果分析

在本案例中主要是对全国主要城市的气温进行k-means聚类分析,从而总结出不同地区相同时间段内气温变化的相似性和差异性。但由于数据的原因,效果不是很明显。

综合海陆位置、海拔以及经纬度等多种地理学因素,可以得出:第一类红色代表北纬40°以北地区,第二类蓝色代表北纬25°~40°之间的地区,第三类绿色代表北纬25°以南地区。

2.2 k-means算法应用实例(二)

此案例主要是k-means算法在遥感图像中的应用:将某一区域的遥感图像波段信息进行标准化处理,标准化的方法为平均值标准化,即(某一波段像元灰度值减去该波段像元灰度平均值)/该波段像元灰度平均值。

2.2.1 算法代码

(1)k-means算法主程序

%k-means算法主程序

k=4;

x =[ 1.2126 2.1338 0.5115 0.2044

-0.9316 0.7634 0.0125 -0.2752

-2.9593 0.1813 -0.8833 0.8505

3.1104 -2.5393 -0.0588 0.1808

-3.1141 -0.1244 -0.6811 0.9891

-3.2008 0.0024 -1.2901 0.9748 -1.0777 1.1438 0.1996 0.0139

-2.7213 -0.1909 0.1184 0.1013

-1.1467 1.3820 0.1427 -0.2239

1.1497 1.9414 -0.3035 0.3464

2.6993 -2.2556 0.1637 -0.0139

-3.0311 0.1417 0.0888 0.1791

-2.8403 -0.1809 -0.0965 0.0817

1.0118 2.0372 0.1638 -0.0349

-0.8968 1.0260 -0.1013 0.2369

1.1112 1.8802 -0.0291 -0.1506

1.1907 2.2041 -0.1060 0.2167

-1.0114 0.8029 -0.1317 0.0153

-3.1715 0.1041 -0.3338 0.0321

0.9718 1.9634 0.0305 -0.3259

-1.0377 0.8889 -0.2834 0.2301

-0.8989 1.0185 -0.0289 0.0213

-2.9815 -0.4798 0.2245 0.3085

-0.8576 0.9231 -0.2752 -0.0091

-3.1356 0.0026 -1.2138 0.7733

3.4470 -2.2418 0.2014 -0.1556

2.9143 -1.7951 0.1992 -0.2146

3.4961 -2.4969 -0.0121 0.1315

-2.9341 -0.1071 -0.7712 0.8911

-2.8105 -0.0884 -0.0287 -0.1279

3.1006 -2.0677 -0.2002 -0.1303

0.8209 2.1724 0.1548 0.3516

-2.8500 0.3196 0.1359 -0.1179

-2.8679 0.1365 -0.5702 0.7626

-2.8245 -0.1312 0.0881 -0.1305

-0.8322 1.3014 -0.3837 0.2400

-2.6063 0.1431 0.1880 0.0487

-3.1341 -0.0854 -0.0359 -0.2080

0.6893 2.0854 -0.3250 -0.1007

1.0894 1.7271 -0.0176 0.6553

-2.9851 -0.0113 0.0666 -0.0802

1.0371 2.2724 0.1044 0.3982

-2.8032 -0.2737 -0.7391 1.0277

-2.6856 0.0619 -1.1066 1.0485

-2.9445 -0.1602 -0.0019 0.0093

1.2004 2.1302 -0.1650 0.3413

3.2505 -1.9279 0.4462 -0.2405

-1.2080 0.8222 0.1671 0.1576

-2.8274 0.1515 -0.9636 1.0675

2.8190 -1.8626 0.2702 0.0026

1.0507 1.7776 -0.1421 0.0999

-2.8946 0.1446 -0.1645 0.3071 -1.0105 1.0973 0.0241 0.1628

-2.9138 -0.3404 0.0627 0.1286

-3.0646 -0.0008 0.3819 -0.1541

1.2531 1.9830 -0.0774 0.2413

1.1486 2.0440 -0.0582 -0.0650

-3.1401 -0.1447 -0.6580 0.9562

-2.9591 0.1598 -0.6581 1.1937

-2.9219 -0.3637 -0.1538 -0.2085

2.8948 -2.2745 0.2332 -0.0312

-3.2972 -0.0219 -0.0288 -0.1436

-1.2737 0.7648 0.0643 0.0858

-1.0690 0.8108 -0.2723 0.3231

-0.5908 0.7508 -0.5456 0.0190

0.5808 2.0573 -0.1658 0.1709

2.8227 -2.2461 0.2255 -0.3684

0.6174 1.7654 -0.3999 0.4125

3.2587 -1.9310 0.2021 0.0800

1.0999 1.8852 -0.0475 -0.0585

-2.7395 0.2585 -0.8441 0.9987

-1.2223 1.0542 -0.2480 -0.2795

-2.9212 -0.0605 -0.0259 0.2591

3.1598 -2.2631 0.1746 0.1485

0.8476 1.8760 -0.2894 -0.0354

2.9205 -2.2418 0.4137 -0.2499

2.7656 -2.1768 0.0719 -0.1848

-0.8698 1.0249 -0.2084 -0.0008

-1.1444 0.7787 -0.4958 0.3676

-1.0711 1.0450 -0.0477 -0.4030

0.5350 1.8110 -0.0377 0.1622

0.9076 1.8845 -0.1121 0.5700

-2.7887 -0.2119 0.0566 0.0120

-1.2567 0.9274 0.1104 0.1581

-2.9946 -0.2086 -0.8169 0.6662

1.0536 1.9818 -0.0631 0.2581

-2.8465 -0.2222 0.2745 0.1997

-2.8516 0.1649 -0.7566 0.8616

-3.2470 0.0770 0.1173 -0.1092

-2.9322 -0.0631 -0.0062 -0.0511

-2.7919 0.0438 -0.1935 -0.5023

0.9894 1.9475 -0.0146 -0.0390

-2.9659 -0.1300 0.1144 0.3410

-2.7322 -0.0427 -1.0758 0.9718

-1.4852 0.8592 -0.0503 -0.1373

2.8845 -2.1465 -0.0533 -0.1044

-3.1470 0.0536 0.1073 0.3323

2.9423 -2.1572 0.0505 0.1180 -3.0683 0.3434 -0.6563 0.8960

1.3215 2.0951 -0.1557 0.3994

-0.7681 1.2075 -0.2781 0.2372

-0.6964 1.2360 -0.3342 0.1662

-0.6382 0.8204 -0.2587 0.3344

-3.0233 -0.1496 -0.2607 -0.0400

-0.8952 0.9872 0.0019 0.3138

-0.8172 0.6814 -0.0691 0.1009

-3.3032 0.0571 -0.0243 -0.1405

0.7810 1.9013 -0.3996 0.7374

-0.9030 0.8646 -0.1498 0.1112

-0.8461 0.9261 -0.1295 -0.0727

2.8182 -2.0818 -0.1430 -0.0547

2.9295 -2.3846 -0.0244 -0.1400

1.0587 2.2227 -0.1250 0.0957

3.0755 -1.7365 -0.0511 0.1500

-1.3076 0.8791 -0.3720 0.0331

-2.8252 -0.0366 -0.6790 0.7374

-2.6551 -0.1875 0.3222 0.0483

-2.9659 -0.1585 0.4013 -0.1402

-3.2859 -0.1546 0.0104 -0.1781

-0.6679 1.1999 0.1396 -0.3195

-1.0205 1.2226 0.1850 0.0050

-3.0091 -0.0186 -0.9111 0.9663

-3.0339 0.1377 -0.9662 1.0664

0.8952 1.9594 -0.3221 0.3579

-2.8481 0.1963 -0.1428 0.0382

1.0796 2.1353 -0.0792 0.6491

-0.8732 0.8985 -0.0049 0.0068

1.0620 2.1478 -0.1275 0.3553

3.4509 -1.9975 0.1285 -0.1575

-3.2280 -0.0640 -1.1513 0.8235

-0.6654 0.9402 0.0577 -0.0175

-3.2100 0.2762 -0.1053 0.0626

3.0793 -2.0043 0.2948 0.0411

1.3596 1.9481 -0.0167 0.3958

-3.1267 0.1801 0.2228 0.1179

-0.7979 0.9892 -0.2673 0.4734

2.5580 -1.7623 -0.1049 -0.0521

-0.9172 1.0621 -0.0826 0.1501

-0.7817 1.1658 0.1922 0.0803

3.1747 -2.1442 0.1472 -0.3411

2.8476 -1.8056 -0.0680 0.1536

-0.6175 1.4349 -0.1970 -0.1085

0.7308 1.9656 0.2602 0.2801

-1.0310 1.0553 -0.2928 -0.1647 -2.9251 -0.2095 0.0582 -0.1813

-0.9827 1.2720 -0.2225 0.2563

-1.0830 1.1158 -0.0405 -0.1181

-2.8744 0.0195 -0.3811 0.1455

3.1663 -1.9241 0.0455 0.1684

-1.0734 0.7681 -0.4725 -0.1976];

[n,d] = size(x);

bn=round(n/k*rand);%第一个随机数在前1/K的范围内

nc=[x(bn,:);x(2*bn,:);x(3*bn,:);x(4*bn,:)];%初始聚类中心

[cid,nr,centers] = kmeans(x,k,nc)%调用kmeans函数

for i=1:150,

if cid(i)==1,

plot(x(i,1),x(i,2),'r*') % 显示第一类

hold on

else

if cid(i)==2,

plot(x(i,1),x(i,2),'b*') %显示第二类

hold on

else

if cid(i)==3,

plot(x(i,1),x(i,2),'g*') %显示第三类

hold on

else

if cid(i)==4,

plot(x(i,1),x(i,2),'k*') %显示第四类

hold on

end

end

end

end

end

strt=['红色*为第一类;蓝色*为第二类;绿色*为第三类;黑色*为第四类' ];

text(-4,-3.6,strt);

(2)kmeans函数

kmeans函数同案例(一)

2.2.2 使用数据

(由于数据太多,就不在此表述,数据已经在程序中表述)

2.2.3 分类效果图及结果分析

(1)聚类过程

No points were moved after the initial clustering procedure.

cid = Columns 1 through 18

1 4 2 3 2 2 4 2 4 1 3 2 2 1

4 1 1 4

Columns 19 through 36

2 1 4 4 2 4 2 3 3 3 2 2 3 1

2 2 2 4

Columns 37 through 54

2 2 1 1 2 1 2 2 2 1 3 4 2 3

1 2 4 2

Columns 55 through 72

2 1 1 2 2 2 3 2 4 4 4 1 3 1

3 1 2 4

Columns 73 through 90

2 3 1 3 3 4 4 4 1 1 2 4 2 1

2 2 2 2

Columns 91 through 108

2 1 2 2 4 3 2 3 2 1 4 4 4 2

4 4 2 1

Columns 109 through 126

4 4 3 3 1 3 4 2 2 2 2 4 4 2

2 1 2 1

Columns 127 through 144

4 1 3 2 4 2 3 1 2 4 3 4 4 3

3 4 1 4

Columns 145 through 150

2 4 4 2 3 4

nr =

30 55 25 40

centers = 0.9952 1.9979 -0.0785 0.2296

-2.9629 -0.0230 -0.2970 0.3411

3.0234 -2.0986 0.1021 -0.0506

-0.9569 0.9978 -0.1237 0.0493

(2)分类效果图

图2 案例二效果图

(3)分类结果分析

k-means算法在本案例中主要是对遥感图像像元灰度值进行聚类分析,从而确定地物类型,最后根据像元灰度值的特定规律,结合地理学知识,对遥感图像进行解译。

综合遥感波段知识,可以得出:第一类红色的代表居民地,第二类蓝色代表植被,第三类绿色代表水体,第四类黑色的代表裸岩。 【参考文献】

[1] 陈晓春. 基于K-Means和EM算法的聚类分析[J].福建电脑,2009,2:79-80.

[2] 步媛媛,关忠仁. 基于K-means聚类算法的研究[J]. 西南民族大学学报,2009,35(1):198-200.

[3] 陈寿文,李明东. 基于面向对象思想K-Means算法实现[J]. 滁州学院学报,2008,10(3):42-44.

[4] 黄振华,向阳,张波,王栋,刘啸岭. 一种进行K-Means聚类的有效方法[J]. 模式识别与人工智能,2010,23(4):516-521.

[5] 陈燕.数据挖掘技术与应用[M]. 北京:清华大学出版社,2011.

[6] 蒋盛益,李霞,郑琪.数据挖掘原理与实践[M]. 北京:电子工业出版社,2011.

[7] 邵峰晶,于忠清,王金龙,孙仁诚. 数据挖掘原理与算法[M]. 北京:科学出版社,2011.