機器學習--K-means&DBSCAN

一. K-means實現(xiàn)

  1. 讀取數(shù)據(jù)
import pandas as pd
beer = pd.read_csv('data.txt', sep=' ')
beer
  1. 取出其中四列
X = beer[["calories","sodium","alcohol","cost"]]
X
  1. 使用K-means對X進行分類
from sklearn.cluster import KMeans
# 分別取3個和2個質(zhì)心的情況
km = KMeans(n_clusters=3).fit(X)
km2 = KMeans(n_clusters=2).fit(X)
km.labels_ # 每個樣本點對應的分類
  1. 根據(jù)分類進行排序
beer['cluster'] = km.labels_
beer['cluster2'] = km2.labels_
beer.sort_values('cluster')
  1. 計算cluster=3時的平均值
beer.groupby('cluster').mean()
  1. 計算cluster=2時的平均值
beer.groupby('cluster2').mean()
  1. 利用reset_index重置索引
centers = beer.groupby('cluster').mean().reset_index()
centers
  1. 分類效果的可視化
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.size'] = 14
colors = np.array(['red', 'green', 'blue', 'yellow'])
# 數(shù)據(jù)分布三點圖
plt.scatter(beer['calories'], beer['alcohol'], c=colors[beer['cluster']]) 
# 關(guān)于 calories alcohol 的三個類的平均值分布
plt.scatter(centers.calories, centers.alcohol, linewidth=3, marker='+', s=300, c='black') 

plt.xlabel('Calories')
plt.ylabel('Alcohol')
  1. 計算不同cluster每個分類不同特征的centers值
from pandas.tools.plotting import scatter_matrix
%matplotlib inline

cluster_centers = km.cluster_centers_
cluster_centers_2 = km2.cluster_centers_

print (cluster_centers)
print (cluster_centers_2)
  1. 基于步驟9翁垂,cluster=3 進行可視化
scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster"]], figsize=(10,10))
plt.suptitle("With 3 centroids initialized")
  1. 基于步驟9橙困,cluster=2 進行可視化
scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster2"]], figsize=(10,10))
plt.suptitle("With 2 centroids initialized")

二. 數(shù)據(jù)標準化

  1. 數(shù)據(jù)標準化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled
  1. 使用標準化后的數(shù)據(jù)生成新的cluster=3好爬,且應用于原始數(shù)據(jù)進行分類
km = KMeans(n_clusters=3).fit(X_scaled)
beer["scaled_cluster"] = km.labels_
beer.sort_values("scaled_cluster")
  1. 求mean值
beer.groupby("scaled_cluster").mean()
  1. 可視化
pd.scatter_matrix(X, c=colors[beer.scaled_cluster], alpha=1, figsize=(10,10), s=100)

三:聚類評估:輪廓系數(shù)(Silhouette Coefficient )

  1. 計算當前分類下的輪廓系數(shù)
from sklearn import metrics
score_scaled = metrics.silhouette_score(X,beer.scaled_cluster) #數(shù)據(jù)標準化的輪廓系數(shù)
score = metrics.silhouette_score(X,beer.cluster) #原始數(shù)據(jù)的輪廓系數(shù)
print(score_scaled, score)
  1. 計算不同cluster值下的輪廓系數(shù)
scores = []
for k in range(2,20):
    labels = KMeans(n_clusters=k).fit(X).labels_
    score = metrics.silhouette_score(X, labels)
    scores.append(score)

scores
  1. 基于2,進行可視化,觀察走向(cluster=2最合適)
plt.plot(list(range(2,20)), scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihouette Score")

四.DBSCAN Clustering

  1. 數(shù)據(jù)初始化汪榔,使用DBSCAN進行分類
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=10, min_samples=2).fit(X) #eps 半徑 min_samples 最小密度
labels = db.labels_
beer['cluster_db'] = labels
beer.sort_values('cluster_db')
  1. 求每個特征的均值
beer.groupby('cluster_db').mean()
  1. 可視化
pd.scatter_matrix(X, c=colors[beer.cluster_db], figsize=(10,10), s=100)
  1. 數(shù)據(jù)標準化后進行DBSCAN分類
db = DBSCAN(eps=10, min_samples=2).fit(X) #eps 半徑 min_samples 最小密度
labels = db.labels_
beer['cluster_db'] = labels
beer.sort_values('cluster_db')
  1. 通過改變eps和min_samples數(shù)值,計算輪廓系數(shù)并可視化
scores=[]
counter=0
for eps in range(10,20):
    for min_samples in range(2,10):
        labels=DBSCAN(eps,min_samples).fit(X).labels_
        score=metrics.silhouette_score(X,labels)
        scores.append(score)
        counter+=1
# scores
counter
plt.plot((range(0,80)), scores)
plt.xlabel("value of eps Initialized")
plt.ylabel("Sihouette Score")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贫奠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌望蜡,老刑警劉巖唤崭,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脖律,居然都是意外死亡谢肾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門小泉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芦疏,“玉大人,你說我怎么就攤上這事微姊∷彳睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵柒桑,是天一觀的道長弊决。 經(jīng)常有香客問我,道長魁淳,這世上最難降的妖魔是什么飘诗? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮界逛,結(jié)果婚禮上昆稿,老公的妹妹穿的比我還像新娘。我一直安慰自己息拜,他們只是感情好溉潭,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布净响。 她就那樣靜靜地躺著,像睡著了一般喳瓣。 火紅的嫁衣襯著肌膚如雪馋贤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天畏陕,我揣著相機與錄音配乓,去河邊找鬼。 笑死惠毁,一個胖子當著我的面吹牛犹芹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞠绰,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼腰埂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜈膨?” 一聲冷哼從身側(cè)響起屿笼,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丈挟,沒想到半個月后刁卜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡曙咽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挑辆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片例朱。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鱼蝉,靈堂內(nèi)的尸體忽然破棺而出洒嗤,到底是詐尸還是另有隱情,我是刑警寧澤魁亦,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布渔隶,位于F島的核電站,受9級特大地震影響洁奈,放射性物質(zhì)發(fā)生泄漏间唉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一利术、第九天 我趴在偏房一處隱蔽的房頂上張望呈野。 院中可真熱鬧,春花似錦印叁、人聲如沸被冒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昨悼。三九已至蝗锥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間率触,已是汗流浹背玛追。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闲延,地道東北人痊剖。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像垒玲,于是被迫代替她去往敵國和親陆馁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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