俗話說「物以類聚,人以群分」說的是把相同或相似的東西放在一起比較討論,志同道合的朋友常常能夠相聚在一起把酒言歡。朋友間正是因為有相同的志向和趣味,所以能夠走到一起,與人一樣,資料探勘裡面的聚類是指把具有相同或者相似(退後一步)的物件放在一起討論,從而挖掘出放在一起的理由和不放在一起的理由以及這樣放在一起與不放在一起所帶來的額外效用。也許你會問用什麼辦法來衡量兩個物件的相似性呢?這時候就需要把物件的各種屬性考慮進來,通過對比分析兩個物件的不同屬性間的差異來進行判斷,比如考察某個班所有學生的聚類情況,已經知道所有學生的期末考試成績以及平時缺課次數兩個屬性,可以按照下面規則聚集
我們看到了按照成績屬性取優異還是掉渣以及缺課屬性取缺還是不缺共4種組合可以把班裡所有學生劃分成4類,這樣每一類的學生都有自己的特點,同類別的學生有著非常高的相似度,不同類的學生卻是天壤之別。這裡,我們又引進了相似度的概念,如果兩個物件各屬性相似度高,那麼這兩個物件理應屬於同一類別,反之應該屬於不同類別,上面我們只是通過描述性的語言來說明分類情況, 那麼如何用數學語言來刻畫呢? 常見的相似度刻畫採用距離公式,主要有以下幾種距離公式,為討論的一般性,我們假設有n
nn個樣本,每個樣本有p
pp個指標,資料矩陣如下表所示
記第i
ii個樣本為(i)
=(xi
1,⋯,
xip)
t(i)=(x_,\cdots,x_)^t
(i)=(x
i1,
⋯,xi
p)t
,第j
jj個樣本為(j)
=(xj
1,⋯,
xjp)
t(j)=(x_,\cdots,x_)^t
(j)=(x
j1,
⋯,xj
p)t
,把每個樣本看成p
pp維空間裡的質點,記(i)
(i)(i
)與(j
)(j)
(j)的距離為d(i
,j)d(i,j)
d(i,j)
, 那麼
從各種距離公式可以看出,切比雪夫距離和歐式距離是閔科夫斯基距離當q=1
q=1q=
1和q=
2q=2
q=2的特殊情況。
很多初學者會把聚類和分類混肴,那麼聚類和分類有何區別呢?主要體現在
常見的聚類演算法有基於空間測距的kmeans演算法,基於密度劃分的dbscan演算法,基於點距離的 hierarchical clustering演算法,基於圖距離的affinity propagation演算法等,這裡重點介紹kmeans演算法。
kmeans翻譯成中文表示k均值,kmeans演算法的關鍵是找k
kk個均值來當作類別的中心,並以此為參考將其他例項吸收到這k
kk個類別,使得最後距離和最小。假設有n
nn個例項,現在要將其劃分到k
kk個不相鄰的類別或簇c
=\mathcal=\
c=,記第j
jj個簇c
jc_j
cj中的樣本均值(中心)為u
ju_j
uj, kmeans 演算法旨在選擇合適的u
ju_j
uj,使得簇內平方和最小,即
min u
j∈c∑
j=1k
∑i=1
n∣∣x
i−uj
∣∣2\min\limits_ \sum\limits_^k\sum\limits_^n||x_i-u_j||^2
uj∈
cminj
=1∑k
i=1
∑n∣
∣xi
−uj
∣∣2
kmeans演算法比較簡單,只有三步
初始化k
kk個中心,當成k
kk個初始簇
將每乙個例項劃分到離其最近的中心簇
計算每個簇的均值,得到新的簇中心
如果前後兩次計算得到簇中心不發生變化,或者變化小於給定的閾值,演算法結束,否則返回2計算每個樣本到新的簇中心的距離
kmeans演算法假設簇都是凸的且同性的,而對長條形和不正規的形狀表現不好,對於高維資料,kmeans演算法會消耗更多計算資源。
# -*- coding: utf-8 -*-
"""project_name:聚類演算法
@author: 帥帥de三叔
created on wed nov 6 10:05:42 2019
"""import pandas as pd #匯入資料分析模組
from sklearn import preprocessing #匯入資料預處理模組
from sklearn.cluster import kmeans #匯入kmeans聚類演算法
data=pd.read_excel(
"2018vs2016.xlsx"
,index_col=u"板塊名稱"
,sheet_name=
"2018"
)#讀取資料
x=data.iloc[:,
0:-1
]#聚類用到的特徵屬性
x_scaled=preprocessing.standardscaler(copy=
true
,with_mean=
true
,with_std=
true
).fit_transform(x)
#特徵屬性標準化
feature=pd.dataframe(x_scaled)k=4
#設定聚類類別數
maxiteration=
500#設定最大迭代次數
model=kmeans(n_clusters=k,init=
'k-means++'
,n_init=
10,max_iter=maxiteration,tol=1e-
4,precompute_distances=
'auto'
,verbose=
0,random_state=
none
,copy_x=
true
,n_jobs=
2,algorithm=
'auto'
)#聚類模型初始化
model.fit(feature,y=
none
,sample_weight=
none
)#訓練模型
lables=pd.dataframe(model.labels_,index=data.index)
#類別標籤
cluster_result=pd.concat(
[data,lables]
,axis=1)
#沿著水平方向拼接類別標籤
cluster_result.columns=
["交通"
,"商業購物"
,"教育"
,"醫療"
,"景觀周遊"
,"生活娛樂"
,"綜合得分"
,"類別標籤"
]#重新命名表頭
print
(cluster_result)
cluster_result.to_excel(
"板塊聚類結果.xlsx"
K Means聚類演算法
k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...
聚類演算法 K means
演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...
k means聚類演算法
說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...