1、從Kmeans說起
Kmeans是一個非?;A的聚類算法,使用了迭代的思想,關于其原理這里不說了。下面說一下如何在matlab中使用kmeans算法。
創建7個二維的數據點:
代碼如下:x=[randn(3,2)*.4;randn(4,2)*.5+ones(4,1)*[4 4]];
使用kmeans函數:
代碼如下:class = kmeans(x, 2);
x是數據點,x的每一行代表一個數據;2指定要有2個中心點,也就是聚類結果要有2個簇。 class將是一個具有70個元素的列向量,這些元素依次對應70個數據點,元素值代表著其對應的數據點所處的分類號。某次運行后,class的值是:
代碼如下:
2
2
2
1
1
1
1
這說明x的前三個數據點屬于簇2,而后四個數據點屬于簇1。 kmeans函數也可以像下面這樣使用:
代碼如下:
>> [class, C, sumd, D] = kmeans(x, 2)
class =
2
2
2
1
1
1
1
C =
4.0629 4.0845
-0.1341 0.1201
sumd =
1.2017
0.2939
D =
34.3727 0.0184
29.5644 0.1858
36.3511 0.0898
0.1247 37.4801
0.7537 24.0659
0.1979 36.7666
0.1256 36.2149
class依舊代表著每個數據點的分類;C包含最終的中心點,一行代表一個中心點;sumd代表著每個中心點與所屬簇內各個數據點的距離之和;D的每一行也對應一個數據點,行中的數值依次是該數據點與各個中心點之間的距離,Kmeans默認使用的距離是歐幾里得距離(參考資料[3])的平方值。kmeans函數使用的距離,也可以是曼哈頓距離(L1-距離),以及其他類型的距離,可以通過添加參數指定。
kmeans有幾個缺點(這在很多資料上都有說明):
1、最終簇的類別數目(即中心點或者說種子點的數目)k并不一定能事先知道,所以如何選一個合適的k的值是一個問題。
2、最開始的種子點的選擇的好壞會影響到聚類結果。
3、對噪聲和離群點敏感。
4、等等。
2、kmeans++算法的基本思路
kmeans++算法的主要工作體現在種子點的選擇上,基本原則是使得各個種子點之間的距離盡可能的大,但是又得排除噪聲的影響。 以下為基本思路:
1、從輸入的數據點集合(要求有k個聚類)中隨機選擇一個點作為第一個聚類中心
2、對于數據集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離D(x)
新聞熱點
疑難解答