聚類算法
前面介紹的集中算法都是屬于有監督機器學習方法,這章和前面不同,介紹無監督學習算法,也就是聚類算法。在無監督學習中,目標屬性是不存在的,也就是所說的不存在“y”值,我們是根據內部存在的數據特征,劃分不同的類別,使得類別內的數據比較相似。
我們對數據進行聚類的思想不同可以設計不同的聚類算法,本章主要談論三種聚類思想以及該聚類思想下的三種聚類算法。666
本章主要涉及到的知識點有:
“距離”
K-Means算法
幾種優化K-Means算法
密度聚類
算法思想:“物以類聚,人以群分”
本節首先通過聚類算法的基本思想,引出樣本相似度這個概念,并且介紹幾種基本的樣本相識度方法。
算法思想
俗話說:“物以類聚,人以群分”,在自然科學和社會科學中,存在著大量的分類問題。所謂類,通俗地說,就是指相似元素的集合。例如,我們剛生下來父母就開始教我們分類,給我們買很多卡片,告訴我們:(一定要用現實中的例子說名,注重趣味性)
“這是汽車?!?。
“這是飛機?!?br>
“這是魚類。”
“這是鳥類?!?br>
“這是圓?!?br>
“這是長方形。”
“……?!?/p>
可見我們作為一個剛剛進入塵世的人,首先接觸的就是分類了。然而到了今天,回顧我們的科學史,我們很多比較重要的就是發現一個新事物,然后給新事物分類。當然,我們眼里所熟悉的類別,都是根據常識,已經做好的分類。對于計算機來說,更具體一些,對于這里聚類算法;來說也是一樣,只不過,通過算法把那些相識的數據劃分在一起。這是我們本章主要解決的任務。
由上面可得我們本章的重點是將給定的數據劃分為不同的數據類別,是類別之間的相識度最小。
如何將數據劃分不同類別
通過計算樣本之間的相識度,將相識度大的劃分為一個類別。衡量樣本之間的相識度的大小的方式有下面幾種:
- 閔可夫斯基距離(Minkowski距離)也就是前面提到的范式距離
當p=1時為曼哈頓距離,公式如下(以二維空間為例):
當p=2時,為歐幾里得距離,公式如下:
當p=為無窮大時候,為切比雪夫距離,公式如下:
一般情況下用歐幾里得距離比較多,當數據量出現扁平化時候,一般用切夫雪比距離。
- 夾角余弦相識度
假設兩個樣本有2個特征,
則這兩個樣本的夾角余弦相似度公式如下:
最常見的應用就是計算文本相似度。將兩個文本根據他們詞,建立兩個向量,計算這兩個向量的余弦值,就可以知道兩個文本在統計學方法中他們的相似度情況。實踐證明,這是一個非常有效的方法。
- 杰卡德相似系數(Jaccard)
適用于樣本只有(0,1)的情況,又叫二元相似性,計算公式如下:
將杰卡德相似性度量應用到基于物品的協同過濾系統中,并建立起相應的評價分析方法。 與傳統相似性度量方法相比,杰卡德方法完善了余弦相似性只考慮用戶評分而忽略了其他信息量的弊端,特別適合于應用到稀疏度過高的數據。
類別的定義:簇
前面我們講到把數據劃分為不同類別,機器學習給這個類別定義一個新的名字—簇。
將具有M個樣本的數據換分為k個簇,必然k<=M。簇滿足以下條件:
q 每個簇至少包含一個對象
q 每個對象屬于且僅屬于一個簇
q 將上述條件的k個簇成為一個合理的聚類劃分
對于給定的類別數目k,首先給定初始劃分,通過迭代改變樣本和簇的隸屬關系,使的每次處理后得到的劃分方式比上一次的好(總的數據集之間的距離和變小了)。
下面介紹一種最常用的一種最基本的算法—K-Means算法
K-Means算法
K- means算法,也稱為K-平均或者K-均值,是一種使用廣泛的最基礎的聚類算法,一般作為掌握聚類算法的第一個算法。
K-Means構建步驟
K-Means算法過程
根據構建K-Means算法步驟用圖表示出來結果如圖所示:
我們用語言和公式來還原上述圖解的過程:
原始數據集有N個樣本,人為給定兩個中心點。
-
分別計算每個樣本到兩個中心點之間的距離,可選歐幾里得距離,計算公式用9.1所提到的公式如下所示:
image.png -
把樣本分為了兩個簇,計算每個簇中樣本點的均值為新的中心點。計算公式如下:
image.png
- 重復以上步驟,知道達到前面所說中止條件。
8.1.1 K-Means的損失函數
我們的目的就是使得最終得到的中心點使得,每個樣本到中心點和最小,每個樣本到中心點距離公式為:
為了使損失函數最小,求偏導可以得到中心點的更新公式為:
K-Means算法遇到的問題
根據上面我們掌握的K-Means算法原理,發現有兩個問題會很大影響K-Means算法。
K- means算法在迭代的過程中使用所有點的均值作為新的質點(中心點),如果簇中存在異常點,將導致均值偏差比較嚴重。例如:
一個簇中有2、4、6、8、100五個數據,那么新的質點為24,顯然這個質點離絕大多數點都比較遠;在當前情況下,使用中位數6可能比使用均值的想法更好,使用中位數的聚類方式叫做K- Mediods聚類(K中值聚類)-
初值敏感
K- means算法是初值敏感的,選擇不同的初始值可能導致不同的簇劃分規則。
為了避免這種敏感性導致的最終結果異常性,可以采用初始化多套初始節點構造不同的分類規則,然后選擇最優的構造規則。
又或者改變初始值的選擇。這樣通過改進的K-Means算法,將在下面進行一一介紹。
下面給出一個初始值敏感的直觀例子。給定一定的數據點如圖9.3所示,我們明顯等看到可以劃分為四個區域:
假如我們隨機給定的中心點A,B,C,D如圖9.3所示:
我們按照 K-Means算法劃分的結果如圖9.4所示:
K-Means例題
基于scikit包中的創建的模擬數據的API進行數據的創建。使用K-Means對數據進行數據進行劃分類,獲得聚類中心。
- 數據構建。
創建的團狀的數據集合,數據分布呈高斯分布狀況。
from sklearn.datasets import make_blobs
N = 1000
centers = 4
創建呈現4個團狀共1000個樣本數據,樣本有兩個特征屬性,
X, Y = make_blobs(n_samples=N, n_features=2, centers=centers, random_state=0)
- 模型構建
導入K-Means算法包,其底層就是按照前面講的算法步驟一步一步創建的
from sklearn.cluster import KMeans
給出要劃分的中心點樹k,也可以給出算法中止條件,迭代次數,或者簇中心變化率。
km = KMeans(n_clusters=centers, init='random', random_state=28)
km.fit(X)
- 模型的預測
y_hat = km.predict(X)
- 求出模型的中心點坐標,并且得到,樣本到中心點的總距離,也就是前面提到的損失函數。
print("所有樣本距離所屬簇中心點的總距離和為:%.5f" % km.inertia_) print("所有的中心點聚類中心坐標:") cluter_centers = km.cluster_centers_ print(cluter_centers) print("score其實就是所有樣本點離所屬簇中心點距離和的相反數:") print(km.score(X))
得到的結果如下:
所有樣本距離所屬簇中心點的總距離和為:1764.19457
所有的中心點聚類中心坐標:
[[-6.32351035 7.09545595]
[-7.51888142 -2.01003574]
[ 6.0528514 0.24636947]
[ 4.26881816 1.08317321]]
score其實就是所有樣本點離所屬簇中心點距離和的相反數:
-1764.19457007324
- 畫圖,把原始數據和最終預測數據在圖上表現出來
import matplotlib.pyplot as plt import matplotlib as mpl
cm = mpl.colors.ListedColormap(list('rgby')) plt.figure(figsize=(15, 9), facecolor='w') plt.subplot(121) plt.title(u'原始數據') plt.grid(True) plt.scatter(X[:, 0], X[:, 1], c=Y, s=30, cmap=cm, edgecolors='none') plt.subplot(122) plt.scatter(X[:, 0], X[:, 1], c=y_hat, s=30, cmap=cm, edgecolors='none') plt.title(u'K-Means算法聚類結果') plt.grid(True) plt.show()
畫圖的結果如下:
當給定的簇中心的點分別為3,和5結果如下:
K-Means改進的幾種算法
前面簡單地介紹了一種聚類算法思想K-Means算法,由于K-Means算法的簡單且易于實現,因此K-Means算法得到了很多的應用,但是從K-Means算法的過程中發現,K-Means算法中的聚類中心的個數k需要事先指定,這一點對于一些未知數據存在很大的局限性。其次,在利用K-Means算法進行聚類之前,需要初始化k個聚類中心,在上述的K-Means算法的過程中,使用的是在數據集中隨機選擇最大值和最小值之間的數作為其初始的聚類中心,但是聚類中心選擇不好,對于K-Means算法有很大的影響。介紹幾種K-Means改進的算法。
K-Means++算法
K-Means++算法在聚類中心的初始化過程中的基本原則是使得初始的聚類中心之間的相互距離盡可能遠,這樣可以避免出現上述的問題。從而可以解決K- Means算法對初始簇心比較敏感的問題,K- Means++算法和K- Means算法的區別主要在于初始的K個中心點的選擇方面。
K- Means算法使用隨機給定的方式,K- Means++算法采用下列步驟給定K個初始質點:
q 從數據集中任選一個節點作為第一個聚類中心
q 對數據集中的每個點ⅹ,計算x到所有已有聚類中心點的距離和D(X),基于D(X)采用線性概率(每個樣本被選為下一個中心點的概率)選擇出下一個聚類中心點距離較遠的一個點成為新增的一個聚類中心點)
q 重復步驟2直到找到k個聚類中心點
這種由于依靠中心點和中心點之間的有序性進行中心點的劃分,雖然避免了初始值敏感問題,可對于特別離散的數據,效果就不是很好了。
參考文獻:Bahman Bahmani,Benjamin Moseley,Andrea Vattani.Scalable K-Means++
K-Meansll算法
k-means++ 最主要的缺點在于其內在的順序執行特性,得到 k 個聚類中心必須遍歷數據集 k 次,并且當前聚類中心的計算依賴于前面得到的所有聚類中心,這使得算法無法并行擴展,極大地限制了算法在大規模數據集上的應用。
這是一種針對K-Means++改進的算法,主要思路是改變每次遍歷時候的取樣規則,并非按照K- Means++算法每次遍歷只獲取一個樣本,而是每次獲取K個樣本,重復該取樣操作O(klogn)次,然后再將這些抽樣出來的樣本聚類出K個點,最后使用這K個點作為K- Means算法的初始聚簇中心點。一般情況下,重復幾次就可以得到比較好的中心點。
二分K- Means算法
同樣是為了解決K- Means算法對初始簇心比較敏感的問題,二分K- Means算法和前面兩種尋找其他質心不同,它是一種弱化初始質心的一種算法。
這個算法的思想是:首先將所有點作為一個簇,然后將該簇一分為二。之后選擇能最大程度降低聚類代價函數(也就是誤差平方和)的簇劃分為兩個簇(或者選擇最大的簇等,選擇方法多種)。以此進行下去,直到簇的數目等于用戶給定的數目k為止。
算法的步驟如下:
q 將所有樣本數據作為一個簇放到一個隊列中
q 從隊列中選擇一個簇進行K- means算法劃分,劃分為兩個子簇,并將子簇添加到隊列中
q 循環迭代第二步操作,直到中止條件達到(聚簇數量、最小平方誤差、迭代次數等)
q 隊列中的簇就是最終的分類簇集合
從隊列中選擇劃分聚簇的規則一般有兩種方式;分別如下:
(1)對所有簇計算誤差和SSE(SSE也可以認為是距離函數的一種變種),選擇SSE最大的聚簇進行劃分操作(優選這種策略)
(2)選擇樣本數據量最多的簇進行劃分操作
Canopy算法
Canopy Clustering 這個算法是2000年提出來的,此后與Hadoop配合,已經成為一個比較流行的算法了。確切的說,這個算法獲得的并不是最終結果,它是為其他算法服務的,比如k-means算法。它能有效地降低k-means算法中計算點之間距離的復雜度。算法流程如下:
(1)給定樣本列表L=x1,,2…,m以及先驗值T1和T2(T1>T2)
(2)從列表L中獲取一個節點P,計算P到所有聚簇中心點的距離(如果不存在聚簇中心,那么此時點P形成一個新的聚簇),并選擇出最小距離D(P,aj)。
(3)如果距離D小于T1,表示該節點屬于該聚簇,添加到該聚簇列表中
(4)如果距離D小于T2,表示該節點不僅僅屬于該聚簇,還表示和當前聚簇中心點非常近,所以將該聚簇的中心點設置為該簇中所有樣本的中心點,并將P從列表L中刪除。
(5)如果距離D大于T1,那么節點P形成一個新的聚簇。
(6)直到列表L中的元素數據不再有變化或者元素數量為0的時候,結束循環操作。
該步驟用流程圖表示如下圖所示:
Canopy算法得到的最終結果的值,聚簇之間是可能存在重疊的,但是不會存在某個對象不屬于任何聚簇的情況。
可以看到canopy算法將可以將一堆雜亂的數據大致的劃分為幾塊所以Canopy算法一般會和kmeans算法配合使用來到達使用者的目的在使用Canopy算法時,閾值t1,t2的確定是十分重要的。t1的值過大,會導致更多的數據會被重復迭代,形成過多的Canopy;值過小則導致相反的效果t2的值過大,會導致一個canopy中的數據太多,反之則過少這樣的情況都會導致運行的結果不準確。該算法的過程圖形說明如圖所示:
Mini batch k- Means算法
Mini Batch K-Means使用了一個種叫做Mini Batch(分批處理)的方法對數據點之間的距離進行計算。Mini Batch的好處是計算過程中不必使用所有的數據樣本,而是從不同類別的樣本中抽取一部分樣本來代表各自類型進行計算。由于計算樣本量少,所以會相應的減少運行時間,但另一方面抽樣也必然會帶來準確度的下降。這樣使用于存在巨大的數據集合的情況下。
實際上,這種思路不僅應用于K-Means聚類,還廣泛應用于梯度下降、深度網絡等機器學習和深度學習算法。
該算法的算法流程和k- Means類似,流程如下:
(1)首先抽取部分數據集,使用K- Means算法構建出K個聚簇點的模型。
(2)繼續抽取訓練數據集中的部分數據集樣本數據,并將其添加到模型中,分配給距離最近的聚簇中心點。
(3)更新聚簇的中心點值。
(4)循環迭代第二步和第三步操作,直到中心點穩定或者達到迭代次數,停止計算操作。
應用場景,由于Mini Batch KMeans跟K-Means是極其相似的兩種聚類算法,因此應用場景基本一致。
后面我們就以 Mini batch k- Means算法為例子,比較一下它和 k- Means算法的區別。
8.1.1 聚類算法評估
有監督的分類算法的評價指標通常是accuracy, precision, recall, etc;由于聚類算法是無監督的學習算法,評價指標則沒有那么簡單了。因為聚類算法得到的類別實際上不能說明任何問題,除非這些類別的分布和樣本的真實類別分布相似,或者聚類的結果滿足某種假設,即同一類別中樣本間的相似性高于不同類別間樣本的相似性。
下面介紹幾種常見的評估方法:
- 均一性又叫完整性
一個簇只包含一個類別樣本,滿足均一性,也可以認為正確率(每個簇中正確分類占該簇總樣本的比),公式如下:
- 蘭德系數(RI)
蘭德系數(Rand index)需要給定實際類別信息C,假設K是聚類結果,a表示在C與K中都是同類別的元素對數,b表示在C與K中都是不同類別的元素對數,則蘭德指數為:
分子:屬性一致的樣本數,即同屬于這一類或都不屬于這一類。a是真實在同一類、預測也在同一類的樣本數;b是真實在不同類、預測也在不同類的樣本數;
分母:任意兩個樣本為一類有多少種組合,是數據集中可以組成的總元素對數;
RI取值范圍為[0,1],值越大意味著聚類結果與真實情況越吻合。
對于隨機結果,RI并不能保證分數接近零。為了實現“在聚類結果隨機產生的情況下,指標應該接近零”,調整蘭德系數(Adjusted rand index)被提出,它具有更高的區分度:
ARI取值范圍為[-1,1],值越大意味著聚類結果與真實情況越吻合。從廣義的角度來講,ARI衡量的是兩個數據分布的吻合程度。
優點:
(1)對任意數量的聚類中心和樣本數,隨機聚類的ARI都非常接近于0;
(2)取值在[-1,1]之間,負數代表結果不好,越接近于1越好;
(3)可用于聚類算法之間的比較。
缺點:
ARI需要真實標簽
- 輪廓系數 Silhouette Coefficient
輪廓系數適用于實際類別信息未知的情況。
簇內不相似度:計算樣本i倒同簇其它樣本的平均距離為a;a越小,表示樣本越應該被聚類到該簇,簇C中的所有樣本的a的均值被稱為簇C的簇不相似度。
簇間不相似度:計算樣本i到其它簇C的所有樣本的平均距離b;b=min{b;1,bi2,bi};b越大,表示樣本越不屬于其它簇。
輪廓系數:s值越接近1表示樣本麇類越合理,越接近-1,表示樣本j應該分類到另外的簇中,近似為0,表示樣本應該在邊界上;所有樣本的s的均值被成為聚類結果的輪廓系數。倫敦系數可以寫作:
Scikit-learn中有蘭求德系數方法metrics.silhouette_score。
Python中實現的代碼如下:
from sklearn import metrics from sklearn.metrics import pairwise_distances
from sklearn import datasets
dataset = datasets.load_iris()
X = dataset.data
y = dataset.target
import numpy as np
from sklearn.cluster import KMeans
kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans_model.labels_
metrics.silhouette_score(X, labels, metric='euclidean')
輸出:
蘭德系數為:
0.5730973570083832
示例:比較Mini batch k- Means算法和 k- Means算法
要求:給定較多數據,來比較兩種算法的聚類速度,且用剛學到的聚類評估算法對,這兩種算法進行評估。
兩種的算法的API詳情可以參考網址:
#第一個參數表示給定中心點的個數,第二個參數給出初始質心怎么給,第三個參數是多套初始質心,第四個代表的是迭代次數
sklearn.cluster.KMeans(n_clusters=8, init=’k-means++’, n_init=10, max_iter=300) [](#sklearn.cluster.MiniBatchKMeans "Permalink to this definition")
1. 導入模塊。
#導入我們要用的包,包括算法數據創建模塊,算法評估模塊,算法模塊。
import time import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl from sklearn.cluster import MiniBatchKMeans, KMeans from sklearn.metrics.pairwise import pairwise_distances_argmin from sklearn.datasets.samples_generator import make_blobs
2. 創建數據
#創建呈現3個團狀共3000個樣本數據,樣本有兩個特征屬性,
#初始化三個中心 centers = [[1, 1], [-1, -1], [1, -1]] clusters = len(centers) #聚類的數目為3 #產生3000組二維的數據,中心是意思三個中心點,標準差是0.7 X, Y = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7, random_state=0)
3. 模型構建
#構建kmeans算法 k_means = KMeans(init='k-means++', n_clusters=clusters, random_state=28) t0 = time.time() #當前時間 k_means.fit(X) #訓練模型 km_batch = time.time() - t0 #使用kmeans訓練數據的消耗時間 print ("K-Means算法模型訓練消耗時間:%.4fs" % km_batch)
#構建MiniBatchKMeans算法 batch_size = 100 mbk = MiniBatchKMeans(init='k-means++', n_clusters=clusters, batch_size=batch_size, random_state=28) t0 = time.time() mbk.fit(X) mbk_batch = time.time() - t0 print ("Mini Batch K-Means算法模型訓練消耗時間:%.4fs" % mbk_batch)
#輸出的結果為:
L- Means算法模型訓練消耗時間:0.0416s
M- Mini Batch K-Means算法模型訓練消耗時間:0.0150s
4. 模型的預測
#預測結果 km_y_hat = k_means.predict(X) mbkm_y_hat = mbk.predict(X) print(km_y_hat[:10]) print(mbkm_y_hat[:10]) print(k_means.cluster_centers_) print(mbk.cluster_centers_)
#輸出的結果:
[0 1 0 2 1 1 1 1 2 1]
[[-1.07159013 -1.00648645]
[ 0.96700708 1.01837274]
[ 1.07705469 -1.06730994]]
[[ 1.02538969 -1.08781328]
[-1.06046903 -1.01509453]
[ 0.97734743 1.08610316]]
5.求出質心得坐標并進行排序:
##獲取聚類中心點并聚類中心點進行排序 k_means_cluster_centers = k_means.cluster_centers_#輸出kmeans聚類中心點 mbk_means_cluster_centers = mbk.cluster_centers_#輸出mbk聚類中心點 print ("K-Means算法聚類中心點:\ncenter=", k_means_cluster_centers) print ("Mini Batch K-Means算法聚類中心點:\ncenter=", mbk_means_cluster_centers) order = pairwise_distances_argmin(k_means_cluster_centers, mbk_means_cluster_centers)
得到的結果如下:
K-Means算法聚類中心點:
center= [[-1.07159013 -1.00648645]
[ 0.96700708 1.01837274]
[ 1.07705469 -1.06730994]]
### Mini Batch K-Means算法聚類中心點:
center= [[ 1.02538969 -1.08781328]
[-1.06046903 -1.01509453]
[ 0.97734743 1.08610316]]
6. 畫圖,把原始數據和最終預測數據在圖上表現出來
plt.figure(figsize=(12, 6), facecolor='w') plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.9) cm = mpl.colors.ListedColormap(['#FFC2CC', '#C2FFCC', '#CCC2FF']) cm2 = mpl.colors.ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
7. 創建各個子圖:
#子圖1:原始數據 plt.subplot(221) plt.scatter(X[:, 0], X[:, 1], c=Y, s=6, cmap=cm, edgecolors='none') plt.title(u'原始數據分布圖') plt.grid(True) #子圖2:K-Means算法聚類結果圖 plt.subplot(222) plt.scatter(X[:,0], X[:,1], c=km_y_hat, s=6, cmap=cm,edgecolors='none') plt.scatter(k_means_cluster_centers[:,0], k_means_cluster_centers[:,1],c=range(clusters),s=60,cmap=cm2,edgecolors='none') plt.title(u'K-Means算法聚類結果圖') plt.text(-3.8, 3, 'train time: %.2fms' % (km_batch*1000)) plt.grid(True) #子圖三Mini Batch K-Means算法聚類結果圖 plt.subplot(223) plt.scatter(X[:,0], X[:,1], c=mbkm_y_hat, s=6, cmap=cm,edgecolors='none') plt.scatter(mbk_means_cluster_centers[:,0], mbk_means_cluster_centers[:,1],c=range(clusters),s=60,cmap=cm2,edgecolors='none') plt.title(u'Mini Batch K-Means算法聚類結果圖') plt.text(-3.8, 3, 'train time: %.2fms' % (mbk_batch*1000)) plt.grid(True)
8. 創建兩則分不同的點子圖:
different = list(map(lambda x: (x!=0) & (x!=1) & (x!=2), mbkm_y_hat)) for k in range(clusters): different += ((km_y_hat == k) != (mbkm_y_hat == order[k])) identic = np.logical_not(different) different_nodes = len(list(filter(lambda x:x, different))) plt.subplot(224) # 兩者預測相同的 plt.plot(X[identic, 0], X[identic, 1], 'w', markerfacecolor='#bbbbbb', marker='.') # 兩者預測不相同的 plt.plot(X[different, 0], X[different, 1], 'w', markerfacecolor='m', marker='.') plt.title(u'Mini Batch K-Means和K-Means算法預測結果不同的點') plt.xticks(()) plt.yticks(()) plt.text(-3.8, 2, 'different nodes: %d' % (different_nodes)) plt.show()
- 輸出結果如下:
分析:從上圖,我們看出Mini batch k- Means算法比 k- Means算法速度快了不止一倍,而效果還是不錯的。
思考:如果出現如圖9.7所示出現的數據類型用類 k- Means算法就不能正確地對他們進行聚類了,因為他們屬于非凸類數據。這時候就要轉變聚類思想了,采用別的聚類方法了。
本章小結
本章主要介紹了聚類中的一種最常見的算法—K-Means算法以及其優化算法,聚類是一種無監督學習的方法。我們通過簇來把數據劃分為不同的種類,介紹了該算法的構建流程,根據構建的流程中的初始值敏感問題,我們對最基本的K-Means算法進行了改進,其中Mini batch k- Means算法可以適用于數據量比較多的情況,且效果也不錯。
本章的最后我們根據樣本不同的特征,有時候不適合采用K-Means算法,我們將在下一章介紹幾種其他思想產生的算法。