0.聚類
聚類就是對大量的未知標注的數據集,按數據的內在相似性將數據集划分為多個類別,使類別內的數據相似度較大而類別間的數據相似度較小,聚類屬於無監督的學習方法。
1.內在相似性的度量
聚類是根據數據的內在的相似性進行的,那么我們應該怎么定義數據的內在的相似性呢?比較常見的方法是根據數據的相似度或者距離來定義的,比較常見的有:
- 閔可夫斯基距離/歐式距離
上述距離公式中,當p=2時,就是歐式距離,當p=1時,就是絕對值的和,當p=正無窮時,這個距離變成了維度差最大的那個值。
- 傑卡德相似系數
一般是度量集合之間的相似性。
- 余弦相似度
- Pearson相似系數
對於n維向量的夾角,根據余弦定理,可到:
又由相關系數的計算公式,可得:
不難發現,相關系數就是將x,y坐標向量各自平移到原點后的夾角余弦。
- 相對熵(K-L距離)
2.聚類的基本思想
1.給定一個有N個對象的數據集,構造數據的K個簇,k<=n,並且滿足下列條件:
每一個簇至少包含一個對象。
每一個對象屬於且僅屬於一個簇。
將滿足上述條件的K個簇稱作一個合理划分。
2.基本思想:對於給定的類別K,首先給定初始的划分,通過迭代改變樣本和簇的隸屬關系,使得每一次改進之后的划分方案都較前一次好。
3.K-Means算法
K-means算法,也被稱為K-平均或K-均值,是一種廣泛使用的聚類算法,或者成為其他聚類算法的基礎。
假定輸入樣本為S=x1, x2, ......, xm,則算法步驟為:
選擇初始的k個類別中心,u1, u2, ......, uk。
對於每個樣本的xi,將其中標記為距離類別中心最近的類別,即:
將每個類別中心更新為隸屬該類別的所有樣本的均值。
重復后面的兩步,直到類別中心變化小於某閾值。
終止條件:
迭代次數,簇中心變化率,最小平方誤差MSE。
4.K-Means的公式化解釋
記K個簇中心為u1,u2,......,uk,每個簇的樣本數目為N1,N2,......,Nk。
使用平方誤差作為目標函數:
該函數為關於u1,u2,......,uk的凸函數,計算其駐點,得:
5.K-Means聚類方法總結
優點:
一種經典算法,簡單,快速的聚類算法。
對於大數據集,該算法保持可伸縮性和高效率。
當簇近似為高斯分布時,它的效果較好。
缺點:
在簇的平均值可被定義的情況下才能使用,可能不適用某些情況。
必須實現給出K(聚類的簇數目),而且是初值敏感的,對於不同的初始值,可能會導致不同的結果。
不適合於發現非凸型的簇或者大小差別很大的簇。
對噪聲和孤立點數據敏感。
在很多情況下,可以作為其他聚類的基礎算法,比如譜聚類。
6.代碼示例
1 if __name__ == '__main__': 2 N = 400 3 centers = 4 4 data1, y1 = make_blobs(n_samples=N, n_features=2, centers= centers, random_state=2) 5 data2, y2 = make_blobs(n_samples=N, n_features=2, centers=centers, cluster_std=(1, 2.5, 0.5, 2), random_state=2) 6 plt.figure() 7 plt.plot(data1[:, 0], data1[:, 1], 'ro', data2[:, 0], data2[:, 1], 'g*') 8 plt.show() 9 10 data = np.vstack((data1[y1 == 0][:], data1[y1 == 1][:50], data1[y1 == 2][:20], data1[y1 == 3][:5])) 11 y = np.array([0] * 100 + [1] * 50 + [2] * 20 + [3] * 5) 12 # print(data) 13 # print(y) 14 # plt.figure() 15 # plt.plot(data[:100, 0], data[:100, 1], 'ro', 16 # data[100:150, 0], data[100:150, 1], 'g*', 17 # data[150:170, 0], data[150:170, 1], 'b*', 18 # data[170:175, 0], data[170:175, 1], 'k*') 19 # plt.show() 20 21 cls = KMeans(n_clusters=4, init='k-means++') 22 y1_hat = cls.fit_predict(data1) 23 y2_hat = cls.fit_predict(data2) 24 y_hat = cls.fit_predict(data) 25 # print(y1_hat)
KMeans函數的參數詳解:
n_clusters:整型,缺省值=8 ,生成的聚類數。
max_iter:整型,缺省值=300 。
執行一次k-means算法所進行的最大迭代數。
n_init:整型,缺省值=10 。
用不同的聚類中心初始化值運行算法的次數,最終解是在inertia意義下選出的最優結果。
init:有三個可選值:’k-means++’, ‘random’,或者傳遞一個ndarray向量。
此參數指定初始化方法,默認值為 ‘k-means++’。
(1)‘k-means++’ 用一種特殊的方法選定初始聚類中發,可加速迭代過程的收斂。
(2)‘random’ 隨機從訓練數據中選取初始質心。
(3)如果傳遞的是一個ndarray,則應該形如 (n_clusters, n_features) 並給出初始質心。
precompute_distances:三個可選值,‘auto’,True 或者 False。
預計算距離,計算速度更快但占用更多內存。
(1)‘auto’:如果 樣本數乘以聚類數大於 12million 的話則不預計算距離。
(2)True:總是預先計算距離。
(3)False:永遠不預先計算距離。
tol:float類型,默認值= 1e-4 與inertia結合來確定收斂條件。
n_jobs:整形數。 指定計算所用的進程數。內部原理是同時進行n_init指定次數的計算。
(1)若值為 -1,則用所有的CPU進行運算。若值為1,則不進行並行運算。
(2)若值小於-1,則用到的CPU數為(n_cpus + 1 + n_jobs)。因此如果 n_jobs值為-2,則用到的CPU數為總CPU數減1。
random_state:整型或 numpy.RandomState 類型,可選
用於初始化質心的生成器(generator)。如果值為一個整數,則確定一個seed。此參數默認值為numpy的隨機數生成器。
copy_x:布爾型,默認值=True
當我們precomputing distances時,將數據中心化會得到更准確的結果。如果把此參數值設為True,則原始數據不會被改變。如果是False,則會直接在原始數據
上做修改並在函數返回值時將其還原。但是在計算過程中由於有對數據均值的加減運算,所以數據返回后,原始數據和計算前可能會有細小差別。
聚類結果:
在聚類的過程中,我們發現,如果對數據進行一定的變化,得到的聚類結果可能有所不同,比如旋轉。