K-means聚類及Python實(shí)戰(zhàn)

一、參數(shù)與方法

  1. scikit-learn中用于進(jìn)行k-means機(jī)器學(xué)習(xí)的類是sklearn.cluster.KMeans价脾,它所涉及的參數(shù)有超過10個(gè)之多廷臼,但是最常用的其實(shí)就是n_clusters 和random_state蝗柔;
  2. n_clusters表示打算聚類的數(shù)目,默認(rèn)情況下是8情龄;
  3. random_state表示產(chǎn)生隨機(jī)數(shù)的方法迄汛。默認(rèn)缺省值為None捍壤,此時(shí)隨機(jī)數(shù)產(chǎn)生器是np.random所使用的RandomState實(shí)例“鞍可以自定義一個(gè)RandomState實(shí)例類型作為參數(shù)鹃觉,也可以使用一個(gè)整數(shù)來作為參數(shù),此時(shí)這個(gè)整數(shù)表示產(chǎn)生隨機(jī)數(shù)的種子睹逃,即類編號(hào)盗扇;
  4. 常用方法
  • fit()函數(shù):僅產(chǎn)生聚類中心,即建模沉填。通常利用它疗隶,實(shí)現(xiàn)基于已建立的模型,預(yù)測新元素的分類情況翼闹;
  • predict()函數(shù):基于已知的聚類中心斑鼻,為輸入的數(shù)據(jù)加上分類標(biāo)簽;
  • fit_predict()函數(shù):計(jì)算聚類中心猎荠,并為輸入的數(shù)據(jù)加上分類標(biāo)簽坚弱;

二、聚類步驟

  1. 導(dǎo)入包关摇,準(zhǔn)備數(shù)據(jù)
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

x = np.array([[15, 17], [12,18], [14,15], [13,16], [12,15], [16,12], 
              [4,6], [5,8], [5,3], [7,4], [7,2], [6,5]])
  1. 聚類分析前荒叶,需要確定聚類數(shù)目。數(shù)據(jù)量較少時(shí)输虱,可以直接通過觀察數(shù)據(jù)些楣,確定類別,本例中數(shù)據(jù)宪睹,很明顯可以看出戈毒,聚類數(shù)目設(shè)置為2比較合適;數(shù)據(jù)量較多時(shí)横堡,可以按比例隨機(jī)抽樣,畫散點(diǎn)圖來觀察聚類數(shù)目冠桃;當(dāng)數(shù)據(jù)量特別大時(shí)命贴,可以通過誤差平方和的方式,來確定聚類數(shù)據(jù)食听;
  2. 進(jìn)行k-means聚類胸蛛,使用fit_predit()函數(shù),為數(shù)據(jù)加上聚類標(biāo)簽樱报;
y_pred= KMeans(n_clusters=2).fit_predict(x)
y_pred
array([1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], dtype=int32)
  1. 可視化聚類效果葬项,一類設(shè)置為紅色,另一類設(shè)置為綠色迹蛤;
plt.figure(figsize=(6, 6))
color = ("red", "green")
colors = np.array(color)[y_pred]
plt.scatter(x[:, 0], x[:, 1], c=colors)
plt.show()
  1. 基于上面的聚類結(jié)果民珍,通過fit()函數(shù)和predict()函數(shù)襟士,為新增加的2個(gè)元素,預(yù)測分類嚷量;
kmeans = KMeans(n_clusters=2).fit(x)
new_data = np.array([[3, 3], [15, 15]])

# 預(yù)測分類的結(jié)果
new_kmeans = kmeans.predict(new_data)
new_kmeans
array([1, 0], dtype=int32)

三陋桂、圖片處理實(shí)例

  1. 需求說明
  • 本實(shí)例要學(xué)習(xí)的問題是圖像處理中的色彩量化(Color Quantization)問題;
  • scikit 在通過圖片的作者共同授權(quán)下蝶溶,嵌入了幾個(gè)樣本 JPG圖片嗜历,方便用戶進(jìn)行算法測試。本示例使用名為china.jpg的圖片抖所,經(jīng)統(tǒng)計(jì)其中共有96615種不同的色彩梨州;
  • 要求用更少的色彩來展示這張圖片,從而實(shí)現(xiàn)類似圖像壓縮的目的田轧,比如只用64種顏色暴匠;
  • 使用K-means聚類方法,將原來的96615種色彩聚合成64個(gè)類涯鲁,然后使用新的64個(gè)色彩中心作為新圖像中所使用的色彩巷查;
  • 為了加速聚類過程,其實(shí)抹腿,并不需要讓原來的96615種色彩都參與計(jì)算岛请,可以隨機(jī)從中選取部分(例如1000種)顏色來進(jìn)行計(jì)算;
  1. 聚類
  • 導(dǎo)入包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle
  • 數(shù)據(jù)處理
n_colors = 64    # 聚類數(shù)目為64
china = load_sample_image('china.jpg')
china = np.array(china, dtype=np.float64) / 255    # 讀取照片像素值警绩,并將其轉(zhuǎn)化到[0, 1]
w, h, d = original_shape = tuple(china.shape)
image_array = china.reshape(w * h, d)
  • 聚類
# 隨機(jī)排列崇败,取前1000
image_array_sample = shuffle(image_array, random_state=0)[:1000]  

# 聚類,構(gòu)建模型
kmeans = KMeans(n_clusters=n_colors, random_state=0).fit(image_array_sample)
labels = kmeans.predict(image_array)
  1. 重建圖像
  • 定義重建函數(shù)
def recreate_image(center_data, labels, w, h):
    """基于模型中心肩祥,構(gòu)建圖片"""
    
    d = center_data.shape[1]
    image = np.zeros((w, h, d))
    labels_index = 0
    for i in range(w):
        for j in range(h):
            image[i][j] = center_data[labels[labels_index]]
            labels_index += 1
    return image 
  • 可視化
ax = plt.axes([0, 0, 2, 2])
plt.axis('off')
plt.title('Quantized image (64 colors, K-Means)')
plt.imshow(recreate_image(kmeans.cluster_centers_, labels, w, h))
  • 圖像效果后室,盡管大量減少了色彩使用量,圖像在細(xì)節(jié)上仍然基本保持了原貌混狠,只是壓縮后岸霹,分辨率降低,清晰度變差将饺。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贡避,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子予弧,更是在濱河造成了極大的恐慌刮吧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掖蛤,死亡現(xiàn)場離奇詭異杀捻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚓庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門致讥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仅仆,“玉大人,你說我怎么就攤上這事拄踪∮瘢” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵惶桐,是天一觀的道長撮弧。 經(jīng)常有香客問我,道長姚糊,這世上最難降的妖魔是什么贿衍? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮救恨,結(jié)果婚禮上贸辈,老公的妹妹穿的比我還像新娘。我一直安慰自己肠槽,他們只是感情好擎淤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秸仙,像睡著了一般嘴拢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寂纪,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天席吴,我揣著相機(jī)與錄音,去河邊找鬼捞蛋。 笑死孝冒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拟杉。 我是一名探鬼主播庄涡,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搬设!你這毒婦竟也來了穴店?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤焕梅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后卦洽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贞言,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年阀蒂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了该窗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弟蚀。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酗失,靈堂內(nèi)的尸體忽然破棺而出义钉,到底是詐尸還是另有隱情,我是刑警寧澤规肴,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布捶闸,位于F島的核電站,受9級(jí)特大地震影響拖刃,放射性物質(zhì)發(fā)生泄漏删壮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一兑牡、第九天 我趴在偏房一處隱蔽的房頂上張望央碟。 院中可真熱鬧,春花似錦均函、人聲如沸亿虽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洛勉。三九已至,卻和暖如春墩朦,著一層夾襖步出監(jiān)牢的瞬間坯认,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工氓涣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牛哺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓劳吠,卻偏偏與公主長得像引润,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子痒玩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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