聚类方法(Clustering)
文章目錄
- 1. 聚類基本概念
- 1.1 相似度、距離
- 1.2 類、簇
- 1.3 類之間的距離
- 2. 層次聚類
- 3. K均值聚類
- 3.1 模型
- 3.2 策略
- 3.3 算法
- 3.4 算法特性
- 4. sklearn.cluster
- 4.1 sklearn.cluster.KMeans k均值聚類
- 4.2 Hierarchical clustering 層次聚類
-
聚類:依據樣本特征的相似度或距離,將其歸并到若干個“類”或“簇”的數據分析問題
-
聚類目的:通過得到的類或簇來發(fā)現數據的特點或對數據進行處理,在數據挖掘、模式識別等領域有著廣泛的應用
-
聚類 屬于無監(jiān)督學習,因為只是根據樣本的相似度或距離將其進行歸類,而類或簇事先并不知道
1. 聚類基本概念
1.1 相似度、距離
- 有多種相似度或距離的定義
- 相似度直接影響聚類的結果,其選擇很關鍵
閔可夫斯基距離 :dij=(∑k=1m∣xki?xkj∣p)1pd_{ij} = \bigg(\sum\limits_{k=1}^m |x_{ki} - x_{kj}|^p \bigg)^{\frac{1}{p}}dij?=(k=1∑m?∣xki??xkj?∣p)p1? , 距離越大,相似度越小
p=1p=1p=1, 曼哈頓距離
p=2p=2p=2, 歐式距離
p=∞p=\inftyp=∞, 切比雪夫距離,dij=max?k∣xki?xkj∣d_{ij} = \max\limits_k |x_{ki} - x_{kj}|dij?=kmax?∣xki??xkj?∣
馬哈拉諾比斯距離: 考慮各個分量(特征)之間的相關性,與各個分量的尺度無關,距離越大,相似度越小
dij=[(xi?xj)TS?1(xi?xj)]1/2,S為樣本協方差矩陣d_{ij}=[(x_i-x_j)^TS^{-1}(x_i-x_j)]^{1/2}, \quad S 為樣本協方差矩陣dij?=[(xi??xj?)TS?1(xi??xj?)]1/2,S為樣本協方差矩陣
馬氏距離是歐氏距離的推廣。
相關系數:其絕對值越接近1,越相似;越接近0,越不相似
rij=∑k=1m(xki?xˉi)(xkj?xˉj)[∑k=1m(xki?xˉi)2∑k=1m(xkj?xˉj)2]1/2r_{ij}=\frac{\sum\limits_{k=1}^m(x_{ki }- \bar x_i)(x_{kj}- \bar x_j)}{\bigg[\sum\limits_{k=1}^m(x_{ki }- \bar x_i)^2\sum\limits_{k=1}^m(x_{kj}- \bar x_j)^2 \bigg]^{1/2}}rij?=[k=1∑m?(xki??xˉi?)2k=1∑m?(xkj??xˉj?)2]1/2k=1∑m?(xki??xˉi?)(xkj??xˉj?)?
夾角余弦: 夾角余弦越接近于1,表示樣本越相似;越接近于0,表示樣本越不相似
sij=∑k=1mxkixkj[∑k=1mxki2∑k=1mxkj2]1/2s_{ij} = \frac{\sum\limits_{k=1}^m x_{ki}x_{kj}}{\bigg[ \sum\limits_{k=1}^m x_{ki}^2 \sum\limits_{k=1}^m x_{kj}^2\bigg]^{1/2}}sij?=[k=1∑m?xki2?k=1∑m?xkj2?]1/2k=1∑m?xki?xkj??
- 從距離的角度看,A和B比A和C更相似
- 從相關系數的角度看,A和C比A和B更相似
- 進行聚類時,選擇適合的距離或相似度非常重要
1.2 類、簇
- 聚類得到的類或簇,本質是樣本的子集
- 如果假定一個樣本只能屬于一個類,或類的交集為空集,稱為硬聚類(hard clustering)
- 如果一個樣本可以屬于多個類,或類的交集不為空集,稱為軟聚類(soft clustering)
| dij≤Td_{ij} \le Tdij?≤T ,最常用,且能推出下面的 |
| 1nG?1∑xj∈Gdij≤T\frac{1}{n_G-1}\sum\limits_{x_j \in G}d_{ij} \le TnG??11?xj?∈G∑?dij?≤T |
| 1nG(nG?1)∑xi∈G∑xj∈Gdij≤T,dij≤V\frac{1}{n_G(n_G-1)}\sum\limits_{x_i \in G}\sum\limits_{x_j \in G}d_{ij} \le T ,\quad d_{ij} \le VnG?(nG??1)1?xi?∈G∑?xj?∈G∑?dij?≤T,dij?≤V |
類的特征:
- 類的均值(中心):xˉG=1nG∑i=1nGxi\bar x_G = \frac{1}{n_G}\sum\limits_{i=1}^{n_G}x_ixˉG?=nG?1?i=1∑nG??xi?
- 類的直徑:DG=max?xi,xj∈GdijD_G = \max\limits_{x_i,x_j \in G} d_{ij}DG?=xi?,xj?∈Gmax?dij?
- 類的樣本散布矩陣:AG=∑i=1nG(xi?xˉG)(xi?xˉG)TA_G=\sum\limits_{i=1}^{n_G}(x_i-\bar x_G)(x_i-\bar x_G)^TAG?=i=1∑nG??(xi??xˉG?)(xi??xˉG?)T
- 類的樣本協方差矩陣:SG=1m?1AG=1m?1∑i=1nG(xi?xˉG)(xi?xˉG)T,m樣本維數S_G=\frac{1}{m-1}A_G=\frac{1}{m-1}\sum\limits_{i=1}^{n_G}(x_i-\bar x_G)(x_i-\bar x_G)^T, m樣本維數SG?=m?11?AG?=m?11?i=1∑nG??(xi??xˉG?)(xi??xˉG?)T,m樣本維數
1.3 類之間的距離
-
最短距離或單連接:Dpq=min?{dij∣xi∈Gp,xj∈Gq}D_{pq} = \min \{d_{ij}|x_i \in G_p,x_j \in G_q\}Dpq?=min{dij?∣xi?∈Gp?,xj?∈Gq?}
-
最長距離或完全連接:Dpq=max?{dij∣xi∈Gp,xj∈Gq}D_{pq} = \max \{d_{ij}|x_i \in G_p,x_j \in G_q\}Dpq?=max{dij?∣xi?∈Gp?,xj?∈Gq?}
-
中心距離:Dpq=dxˉpxˉqD_{pq} = d_{\bar x_p\bar x_q}Dpq?=dxˉp?xˉq??
-
平均距離:Dpq=1npnq∑xi∈Gp∑xj∈GqdijD_{pq} = \frac{1}{n_p n_q}\sum\limits_{x_i \in G_p}\sum\limits_{x_j \in G_q}d_{ij}Dpq?=np?nq?1?xi?∈Gp?∑?xj?∈Gq?∑?dij?
2. 層次聚類
- 層次聚類 假設類別之間 存在層次結構,將樣本聚到層次化的類中
- 層次聚類:有聚合(agglomerative)或自下而上(bottom-up)聚類、分裂(divisive)或自上而下(top-down)聚類 兩種方法
- 每個樣本只屬于 一個類,所以層次聚類屬于 硬聚類
聚合聚類:
- 將每個樣本 各自分到一個類
- 之后將相距最近的兩類合并,建立一個新的類
- 重復上一步直到滿足停止條件;得到層次化的類別
分裂聚類:
- 將所有樣本分到一個類
- 之后將已有類中相距最遠的樣本分到兩個新的類
- 重復上一步直到滿足停止條件;得到層次化的類別。
聚合聚類的具體過程如下:
- 對給定的樣本集合,開始將每個樣本分到一個類
- 按照一定規(guī)則,例如 類間距離最小,將 最 滿足規(guī)則條件的兩個類進行合并
- 反復上一步,每次減少一個類,直到滿足停止條件,如 所有樣本聚為一類
聚合聚類需要預先確定三要素:
- (1)距離或相似度(閔可夫斯基距離、馬哈拉諾比斯距離、相關系數、夾角余弦)
- (2)合并規(guī)則(類間距離最小,可以是 最短距離、最長距離、中心距離、平均距離)
- (3)停止條件(類的個數達到閾值(極端情況類的個數是1)、類的直徑超過閾值)
3. K均值聚類
k均值 聚類:是基于樣本集合劃分的聚類算法
- 將樣本集合劃分為 k 個子集,構成 k 個類
- 將 n 個樣本分到 k 個類中,每個樣本到其所屬類的中心的距離最小
- 每個樣本只能屬于一個類,是硬聚類
3.1 模型
n 個樣本 劃分成 k 個類,類之間的交集為空(硬聚類)
3.2 策略
策略:通過損失函數的最小化 選取 最優(yōu)的劃分 或 函數 C?C^*C?
- 樣本距離:歐氏距離,d(xi,xj)=∣∣xi?xj∣∣2d(x_i,x_j)=||x_i-x_j||^2d(xi?,xj?)=∣∣xi??xj?∣∣2
- 損失函數:樣本與其類屬的中心的距離總和,
W(C)=∑l=1k∑C(i)=l∣∣xi?xˉl∣∣2W(C) = \sum\limits_{l=1}^k\sum\limits_{C(i)=l} ||x_i-\bar x_l||^2W(C)=l=1∑k?C(i)=l∑?∣∣xi??xˉl?∣∣2 - 本質:求解最優(yōu)化問題
C?=arg?min?CW(C)=arg?min?C∑l=1k∑C(i)=l∣∣xi?xˉl∣∣2C^* = \argmin\limits_C W(C) = \argmin\limits_C \sum\limits_{l=1}^k\sum\limits_{C(i)=l} ||x_i-\bar x_l||^2C?=Cargmin?W(C)=Cargmin?l=1∑k?C(i)=l∑?∣∣xi??xˉl?∣∣2
n 個樣本 劃分成 k 個類,組合數是指數級的,其最優(yōu)解求解是 NP 困難問題,常用迭代求解
3.3 算法
k均值聚類 的算法是迭代的過程,每次迭代包括兩個步驟
- 首先隨機選擇 k 個類的中心(選 k 個樣本),將其余樣本逐個指派到與其最近的中心的類中,得到一個聚類結果
- 然后更新每個類的樣本的均值,作為類的新的中心
- 重復以上步驟,直到收斂
3.4 算法特性
1. 總體特點
- 基于劃分的聚類方法
- 類別數 k 事先指定
- 以歐氏距離平方表示樣本之間的距離
- 以中心或樣本的 均值 表示類別
- 以 樣本 和 其所屬類的中心 之間的 距離的總和 為最優(yōu)化目標函數
- 得到的類別是平坦的、非層次化的
- 是迭代算法,不能 保證得到全局最優(yōu)
2. 收斂性
- k均值 聚類屬于啟發(fā)式方法,不能 保證收斂到全局最優(yōu)
- 初始中心的選擇 會 直接影響聚類結果
- 類中心在聚類的過程中會發(fā)生移動,但是往往不會移動太大,因為在每一步,樣本被分到與其最近的中心的類中
3. 初始類的選擇
- 選擇不同的初始中心,會得到不同的聚類結果
- 初始中心的選擇,比如 可以用層次聚類對樣本進行聚類,得到k個類時停止。然后從每個類中選取一個與中心距離最近的點
4. 類別數k的選擇
- k 值需要預先指定,而在實際應用中最優(yōu)k值是不知道的
- 解決方法:嘗試不同的k值,檢驗聚類的質量,推測最優(yōu)的k值
- 聚類結果的質量:可以用類的平均直徑來衡量
- 一般地,類別數變小時,平均直徑會增加;類別數變大超過某個值以后,平均直徑會不變;而這個值正是最優(yōu)的k值
- 可以采用二分查找,快速找最優(yōu)的k值
4. sklearn.cluster
sklearn.cluster 官網介紹了10種聚類算法。
4.1 sklearn.cluster.KMeans k均值聚類
sklearn.cluster.KMeans 官網參數介紹
class sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm='auto')主要參數:
-
n_clusters, default=8
類的個數,即k值 -
init:{‘k-means++’, ‘random’}
初始中心選擇,默認選項更好 -
n_init, default=10
多次初始化,然后聚類,最后取最好的聚類結果 -
max_iter, default=300
單次聚類的最大迭代次數 -
tol, default=1e-4
迭代停止精度 -
precompute_distances:‘auto’ or bool, default=’auto’
預先計算距離 -
algorithm:{“auto”, “full”, “elkan”}, default=”auto”
迭代算法.
The classical EM-style algorithm is “full”.
The “elkan” variation is more efficient by using the triangle inequality, but currently doesn’t support sparse data.
“auto” chooses “elkan” for dense data and “full” for sparse data.
代碼示例:
from sklearn.cluster import KMeans import numpy as np # 書上例題 X = np.array([[0, 2], [0, 0], [1, 0], [5, 0], [5, 2]]) kms = KMeans(n_clusters=2).fit(X) print(kms.labels_) print(kms.cluster_centers_)運行結果:
[0 0 0 1 1] [[0.33333333 0.66666667][5. 1. ]]4.2 Hierarchical clustering 層次聚類
sklearn.cluster.AgglomerativeClustering
class sklearn.cluster.AgglomerativeClustering(n_clusters=2, affinity='euclidean', memory=None, connectivity=None, compute_full_tree='auto', linkage='ward', distance_threshold=None)官方代碼示例
總結
以上是生活随笔為你收集整理的聚类方法(Clustering)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员面试金典 - 面试题 08.03.
- 下一篇: LeetCode 1334. 阈值距离内