聚類通常是一種非監督學習方法,對大量的未標注數據集按照數據內在的相似性劃分為若干個類別。比如對客戶進行價值分析,根據不同客戶群體制定不同的營銷策略,需要準確的將客戶分成"重點客戶"、"潛在客戶"、"一般客戶",就會用到聚類的算法。下面介紹3種常用聚類算法和1種判斷曲線相似度的算法。此外還有層次聚類,密度最大值聚類等。
PS:算法只是整個數據挖掘過程中的很小一部分,而根據先驗知識去選擇指標,建立模型,數據預處理才是平時工作中耗時的部分
K-means++
簡單介紹
K-means++是對K-means算法的升級,在初值選擇時更佳合理。由于K-means聚類對初始質心的選擇非常敏感,因此選擇恰當的質心對算法的優劣很關鍵。K-means++算法在選擇初始質心時,選擇彼此距離盡可能遠的K個點
算法過程
1、選擇初值與簇的個數:
通常情況下,簇的個數是根據先驗知識來選擇的。
初始質心選擇彼此距離盡可能遠的K個點:首先隨機選擇一個點作為第一個初始類簇中心點(也可以根據圖像自己指定),記作A;然后選擇距離A點最遠的那個點作為第二個初始類簇中心點,記作B;然后再選擇距離A,B的最近距離最大的點作為第三個初始類簇的中心點,記為C,以此類推,直至選出K個初始類簇中心點。
解釋一下C點的選擇,"距離A,B的最近距離最大的點":假設已經有了A,B兩個點,用d(3,A)表示3號點到A點的距離,假設:
d(3,A)=5,d(3,B)=6,那么3號點距離A,B的最近距離是5;
d(4,A)=10,d(4,B)=20,那么4號點距離A,B的最近距離是10;
d(5,A)=2,d(5,B)=3,那么4號點距離A,B的最近距離是2;
在5,10,2中選擇最大的距離是10,那么C點就是4號節點,C點是離A,B都很遠的那個點。
2、k-means算法過程
a.選取k個簇的質心c1,c2...ck
b.對于每個樣本xi,分別計算d(xi, ci),將其標記為距離簇最近的類別
c.如果當前結果與上次分類結果相同,那么跳出循環。終止條件也可以換位其他條件,比如迭代次數,MSE,簇中心變化率
d.將每個簇中心更新為新分類后所有樣本的均值
e.循環b,c,d過程。
適用范圍
適用于類似圓形的聚類。
適用:
不適用:
DBSCAN
簡單介紹
dbscan是基于密度的聚類,密度聚類算法通常可以把緊密相連,不斷接觸延伸的數據匯聚到一起。可以不指定K值。
算法過程
1、先給出若干定義
對象的ε鄰域:樣本在半徑ε的區域。
核心對象:給定數目m,如果一個樣本的ε鄰域內至少包含m個樣本,則稱此樣本為核心對象。
直接密度可達:如果p在q的ε鄰域內,并且q是一個核心對象,那么就說p從對象q出發是密度可達的。
密度可達:如果存在一個對象鏈p1p2...pn,p1 = q,pn = p,對于1≤i≤n,p[i+1]是p[i]關于ε和m直接密度可達,那么p是從對象q出發關于ε和m密度可達的。
密度相連:如果集合中存在一個對象o,p和q是從o出發關于ε和m密度可達,那么p和q是關于ε和m密度相連。
噪聲:不包含在任何簇中的樣本,稱為噪聲。注:如果m值選的過小,那么包含過少對象的簇也可以被認為是噪聲。
2、dbscan算法過程:
a.人工給定ε鄰域距離和數值m,如果一個點p的ε鄰域內包含多余m個對象,則創建一個p為核心對象的新簇。
b.尋找并合并核心對象直接密度可達的對象。
c.沒有新點更新時,算法結束
適用范圍
可以發現任何形狀的聚類
譜聚類
簡單介紹
譜聚類是求拉普拉斯矩陣的特征向量后,對特征向量的特征值進行聚類。對數據分布的適應性更強
算法過程
1、先給出若干定義
拉普拉斯矩陣:L = D - W
2、譜聚類算法過程
a、計算相似度矩陣W和度矩陣D
b、計算拉普拉斯矩陣L = D - W
c、計算L的特征值和特征向量Lu = λu,因為L是n*n的對稱矩陣,所以L有n個特征值和特征向量。
d、對特征值λ從小到大排序,取前K個特征值的特征向量u1,u2...uk,組成特征向量矩陣U(n行k列)。
e、1號樣本的特征認為是U矩陣的第一行u11,u12...u1k
? ? ? n號樣本的特征認為是U矩陣的第一行un1,un2...unk
f、有了樣本,樣本也選好了特征,使用k-means將n個樣本做聚類,得到K個簇。
g、這個聚類的最終結果就是譜聚類的結果。
適用范圍
適用于各種距離,處理稀疏數據會比其他算法更有效
弗雷歇距離
度量點之間的距離有很多,這里介紹一種度量曲線相似度的方法,Frechet distance。
網上常見的描述方式是
Fréchet distance就是狗繩距離:主人走路徑A,狗走路徑B,各自走完這兩條路徑過程中所需要的最短狗繩長度。
下面更直白的表述一下
兩條曲線L1,L2。a表示L1上的點,b表示L2上的點d(a,b)表示兩點間的距離
當a在0號點時,計算d(0,1),d(0,2)...d(0,n)各個距離,記為集合s0,D0 = max(s0)
當a在1號點時,計算d(1,1),d(1,2)...d(1,n)各個距離,記為集合s1,D1 = max(s1)
以此類推得到D2,D3...Dn
frechet_distance = min(D0,D1,...,Dn)
弗雷歇距離的參考文獻
https://zhuanlan.zhihu.com/p/2015996
題外話:是否能夠根據曲線相似度去判斷兩支股票的k線趨勢是否相同,從而去挑選趨勢相同的股票呢?