機(jī)器學(xué)習(xí)入門-分群?jiǎn)栴}

階層式分群

1凫海、使用scipy繪制樹狀圖

from sklearn.datasets import load_iris
iris=load_iris()
import scipy.cluster.hierarchy as sch
import matplotlib.pyplot as plt
dendrogram = sch.dendrogram(sch.linkage(iris.data,method='ward'))
# method='ward' 其他選擇看sch.linkage幫助家乘,常用ward
plt.title('Dendrogram')
plt.xlabel('Iris')
plt.ylabel('Euclidean distances')
plt.show()
樹狀圖

2科汗、使用sklearn分群

from sklearn.cluster import AgglomerativeClustering
hc = AgglomerativeClustering(n_clusters=3,affinity='euclidean',linkage='ward')
# n_clusters 一般不設(shè)置卷玉,linkage常用ward丈牢,具體看函數(shù)幫助
y_hc = hc.fit_predict(iris.data)
plt.scatter(iris.data[y_hc==0,2],iris.data[y_hc==0,3],s=100,c='red',label='Cluster1')
plt.scatter(iris.data[y_hc==1,2],iris.data[y_hc==1,3],s=100,c='green',label='Cluster2')
plt.scatter(iris.data[y_hc==2,2],iris.data[y_hc==2,3],s=100,c='blue',label='Cluster3')
# 選擇y_hc 分別為0鳞青,1衙四,2的分組铃肯,使用iris.data的第3列(petal.length),第4列(petal.width)數(shù)據(jù)畫圖
plt.title('Culsters of Iris')
plt.xlabel('Petal.Length')
plt.ylabel('Petal.Width')
plt.legend()
plt.show()
sklearn分群

k-means 分群

from sklearn.datasets import load_iris
iris=load_iris()
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3,init = 'k-means++',random_state=123)
# n_clusters指定分為幾個(gè)群传蹈,其他參數(shù)設(shè)置查看KMeans幫助押逼,
y_kmeans = kmeans.fit_predict(iris.data)
import matplotlib.pyplot as plt
plt.scatter(iris.data[y_kmeans==0,2],iris.data[y_kmeans==0,3],s=100,c='red',label='Cluster1')
plt.scatter(iris.data[y_kmeans==1,2],iris.data[y_kmeans==1,3],s=100,c='green',label='Cluster2')
plt.scatter(iris.data[y_kmeans==2,2],iris.data[y_kmeans==2,3],s=100,c='blue',label='Cluster3')
plt.scatter(kmeans.cluster_centers_[:,2],kmeans.cluster_centers_[:,3],s=100,c='yellow',label='center')
# kmeans.cluster_centers_ 得到3個(gè)群的中心點(diǎn)
plt.title('Culsters of Iris')
plt.xlabel('Petal.Length')
plt.ylabel('Petal.Width')
plt.legend()
plt.show()
Kmeans分群

DBSCAN 分群

from sklearn.datasets import load_iris
iris=load_iris()
from sklearn.cluster import DBSCAN
dbs = DBSCAN(eps=1,min_samples=3)
# 無法設(shè)置分為幾個(gè)群,eps點(diǎn)范圍半徑惦界,半徑內(nèi)點(diǎn)成群挑格,min_samples 最小3個(gè)成群
y_dbs = dbs.fit_predict(iris.data)
import matplotlib.pyplot as plt
plt.scatter(iris.data[y_dbs==0,2],iris.data[y_dbs==0,3],s=100,c='red',label='Cluster1')
plt.scatter(iris.data[y_dbs==1,2],iris.data[y_dbs==1,3],s=100,c='green',label='Cluster2')
plt.title('Culsters of Iris')
plt.xlabel('Petal.Length')
plt.ylabel('Petal.Width')
plt.legend()
plt.show()
DBSCAN分群

k-means 和DBSCAN 對(duì)比

import numpy as np
from PIL import Image
img=Image.open('handwrite.png').convert('L').rotate(-90)
imgarr = np.array(img)
# convert('L') 將圖片信息由三維轉(zhuǎn)成二維,rotate(-90)將圖片逆時(shí)針轉(zhuǎn)90度
from sklearn.preprocessing import binarize
imagedata = np.where(binarize(imgarr,0)==0) # 將圖片信息轉(zhuǎn)成布爾型
import matplotlib.pyplot as plt
plt.scatter(imagedata[0],imagedata[1],s=100,c='red',label='Cluster1')
plt.legend()
plt.show()

將1和8 分開
使用kmeans

from sklearn.cluster import KMeans
X = np.column_stack([imagedata[0],imagedata[1]])
kmeans = KMeans(n_clusters=2,init='k-means++',random_state=137)
y_kmeans = kmeans.fit_predict(X)
plt.scatter(X[y_kmeans==0,0],X[y_kmeans==0,1],s=100,c='red',label='Cluster1')
plt.scatter(X[y_kmeans==1,0],X[y_kmeans==1,1],s=100,c='blue',label='Cluster2')
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s=100,c='yellow',label='central')
plt.legend()
plt.show()
kmeans分群

使用DBSCAN

from sklearn.cluster import DBSCAN
dbs =DBSCAN(eps=1,min_samples =3)
y_dbs = dbs.fit_predict(X)
plt.scatter(X[y_dbs==0,0],X[y_dbs==0,1],s=100,c='red',label='Cluster1')
plt.scatter(X[y_dbs==1,0],X[y_dbs==1,1],s=100,c='blue',label='Cluster2')
plt.legend()
plt.show()
DBSCAN分群

分群結(jié)果評(píng)價(jià)

階層式分群和kmeans分群都要事先輸入分成幾個(gè)群沾歪,以下方法主要判斷分為幾個(gè)群比較好漂彤。

方法一 WCSS(with-in cluster sum of square)
import pandas
dataset = pandas.read_csv('Data/customers.csv')
dataset['sex'] = dataset['Genre'].map(lambda e:1 if e=='Male' else 0) # 數(shù)據(jù)預(yù)處理
del dataset['Genre'],dataset['CustomerID'] # 數(shù)據(jù)預(yù)處理
X = dataset.values 
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 5,init='k-means++',random_state=42)
y_kmeans = kmeans.fit_predict(X)
print(kmeans.inertia_)  # kmeans.inertia_ 就是這次kmeans模型的WCSS
import matplotlib.pyplot as plt
wcss= []
for i in range(1,11):
    kmeans = KMeans(n_clusters= i ,init='k-means++',random_state=42) #將數(shù)據(jù)分成1-10個(gè)群,分別計(jì)算WCSS灾搏,然后畫圖
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
plt.plot(range(1,11),wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

得到的WCSS圖挫望,拐點(diǎn)處為最佳的分群數(shù)量(很難看出來,個(gè)人覺得這個(gè)方法沒什么用)


WCSS
方法二 silhouette coefficient

silhouette值越高确镊,分群效果越好

from sklearn import metrics
import matplotlib.pyplot as plt
sil = []
for i in range(2,11):
    kmeans= KMeans(n_clusters=i,init='k-means++',random_state=42) # 分成2-10群士骤,分別計(jì)算silhouette值,畫圖
    y_kmeans = kmeans.fit_predict(X)
    sil.append(metrics.silhouette_score(X,y_kmeans))
plt.plot(range(2,11),sil)
plt.title('The Silhouette Method')
plt.xlabel('Number of clusters')
plt.ylabel('Silhouette Coefficient')
plt.show()
silhouette method
通過silhouette值比較不同分群方法
from sklearn.cluster import AgglomerativeClustering
from sklearn.cluster import KMeans
ward = AgglomerativeClustering(n_clusters=5,affinity='euclidean',linkage='ward')
y_ward = ward.fit_predict(X)
complete = AgglomerativeClustering(n_clusters=5,affinity='euclidean',linkage='complete')
y_complete = complete.fit_predict(X)
kmeans = KMeans(n_clusters=5,init='k-means++',random_state=42)
y_kmeans= kmeans.fit_predict(X)
for est,title in zip([y_ward,y_complete,y_kmeans],['ward','complete','kmeans']):
    print(title,metrics.silhouette_score(X,est))
# ward 0.439975272125
# complete 0.439975272125
# kmeans 0.444242912753
# kmeans方法的silhouette值最高蕾域,分群效果最好
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拷肌,一起剝皮案震驚了整個(gè)濱河市到旦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巨缘,老刑警劉巖添忘,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異若锁,居然都是意外死亡搁骑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門又固,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仲器,“玉大人,你說我怎么就攤上這事仰冠》剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵洋只,是天一觀的道長(zhǎng)辆沦。 經(jīng)常有香客問我,道長(zhǎng)识虚,這世上最難降的妖魔是什么肢扯? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮担锤,結(jié)果婚禮上蔚晨,老公的妹妹穿的比我還像新娘。我一直安慰自己妻献,他們只是感情好蛛株,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著育拨,像睡著了一般谨履。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熬丧,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天笋粟,我揣著相機(jī)與錄音,去河邊找鬼析蝴。 笑死害捕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闷畸。 我是一名探鬼主播尝盼,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼佑菩!你這毒婦竟也來了盾沫?” 一聲冷哼從身側(cè)響起裁赠,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赴精,沒想到半個(gè)月后佩捞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕾哟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年一忱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谭确。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帘营,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逐哈,到底是詐尸還是另有隱情仪吧,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布鞠眉,位于F島的核電站,受9級(jí)特大地震影響择诈,放射性物質(zhì)發(fā)生泄漏械蹋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一羞芍、第九天 我趴在偏房一處隱蔽的房頂上張望哗戈。 院中可真熱鬧,春花似錦荷科、人聲如沸唯咬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胆胰。三九已至,卻和暖如春刻获,著一層夾襖步出監(jiān)牢的瞬間蜀涨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工蝎毡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厚柳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓沐兵,卻偏偏與公主長(zhǎng)得像别垮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扎谎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容