今天我們來看一個非常常見和使用的無監(jiān)督機器學(xué)習(xí)算法——K-均值聚類(K-means)
首先我們先了解一下這個算法的大致背景:
首先要知道什么是聚類
聚是一個將數(shù)據(jù)集中在某些方面相似的數(shù)據(jù)成員進行分類組織的過程既峡,聚類就是一種發(fā)現(xiàn)這種內(nèi)在結(jié)構(gòu)的技術(shù)掏击,聚類技術(shù)經(jīng)常被稱為無監(jiān)督學(xué)習(xí)颠通。
通俗的說蒲牧,就是比如我們?nèi)ズD戏N水稻伟端,水稻田里面有各種各樣的水稻身隐,每株水稻的高低顏色還有其他很多特征都不一樣慎式,我們更具這些特征對水稻進行分類安接,相似的聚為一類。
K-均值聚類的定義
給定一個數(shù)據(jù)點集合和需要的聚類數(shù)目k雾家,k由用戶指定铃彰,k均值算法根據(jù)某個距離函數(shù)反復(fù)把數(shù)據(jù)分入k個聚類中
具體什么含義呢?就是我把每個樣本點的數(shù)據(jù)搜集好芯咧,形成了一個數(shù)據(jù)集牙捉,然后我人為地定義一個K竹揍,就是我想聚成K類,那么K-means算法就會根據(jù)我定義的K進行反復(fù)迭代和計算邪铲,最后芬位,我的所有樣本就會被分成K類
K-means算法的實現(xiàn)
摘自百度百科,我覺的百度百科已經(jīng)說得很清楚了
先隨機選取K個對象作為初始的聚類中心带到。然后計算每個對象與各個種子聚類中心之間的距離昧碉,把每個對象分配給距離它最近的聚類中心。聚類中心以及分配給它們的對象就代表一個聚類揽惹。一旦全部對象都被分配了被饿,每個聚類的聚類中心會根據(jù)聚類中現(xiàn)有的對象被重新計算。這個過程將不斷重復(fù)直到滿足某個終止條件搪搏。終止條件可以是以下任何一個:
Step 1 沒有(或最小數(shù)目)對象被重新分配給不同的聚類
Step 2 沒有(或最小數(shù)目)聚類中心再發(fā)生變化
Step 3 誤差平方和局部最小狭握。
偽代碼
選擇k個點作為初始質(zhì)心。
repeat 將每個點指派到最近的質(zhì)心疯溺,形成k個簇 重新計算每個簇的質(zhì)心
until 質(zhì)心不發(fā)生變化
既然是學(xué)習(xí)最簡單的K-means论颅,就先不講太多的復(fù)雜內(nèi)容,直接上代碼來實戰(zhàn)一下囱嫩。
Scikit-learn - K-means 實戰(zhàn)
首先我先定義一些數(shù)據(jù)恃疯,假設(shè)我在海南種水稻的時候,測量的水稻的株高和劍葉長(數(shù)據(jù)純屬亂扯的哈)墨闲。
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
[6, 2], [2, 3], [4, 2],
[8, 1], [4, 5], [5, 3],
[3, 0], [5, 0], [6, 4],
[4, 9], [6, 4], [3, 6],
[5, 4], [9, 7], [2, 4],
[6, 2], [4, 5], [8, 3]])
X
我們將數(shù)據(jù)輸入這個矩陣中
然后我們大致看一下數(shù)據(jù)的情況
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
[6, 2], [2, 3], [4, 2],
[8, 1], [4, 5], [5, 3],
[3, 0], [5, 0], [6, 4],
[4, 9], [6, 4], [3, 6],
[5, 4], [9, 7], [2, 4],
[6, 2], [4, 5], [8, 3]])
plt.scatter(X[:, 0], X[:, 1], c = "red", marker='o', label='see')
plt.show()
然后直接用scikit的函數(shù)訓(xùn)練澡谭,這里我們可以設(shè)置 K, 我先設(shè)置成 K=2 的情況
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
[6, 2], [2, 3], [4, 2],
[8, 1], [4, 5], [5, 3],
[3, 0], [5, 0], [6, 4],
[4, 9], [6, 4], [3, 6],
[5, 4], [9, 7], [2, 4],
[6, 2], [4, 5], [8, 3]])
rice_cluster = KMeans(n_clusters=2) #設(shè)置一個你想分的類別,定義一個聚類器
rice_cluster.fit(X) # 使用這個數(shù)據(jù)進行訓(xùn)練
rice_cluster.labels_ # 我們可以看到每個樣本點的聚類標(biāo)簽
我們畫圖來看一下結(jié)果
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
[6, 2], [2, 3], [4, 2],
[8, 1], [4, 5], [5, 3],
[3, 0], [5, 0], [6, 4],
[4, 9], [6, 4], [3, 6],
[5, 4], [9, 7], [2, 4],
[6, 2], [4, 5], [8, 3]])
rice_cluster = KMeans(n_clusters=2) #設(shè)置一個你想分的類別损俭,定義一個聚類器
rice_cluster.fit(X) # 使用這個數(shù)據(jù)進行訓(xùn)練
label = rice_cluster.labels_
x0 = X[label == 0]
x1 = X[label == 1]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c = "blue", marker='*', label='label1')
plt.show()
使用輪子的好處就是你主要調(diào)參就行了蛙奖,接下來我們調(diào)整成3類試試看
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
[6, 2], [2, 3], [4, 2],
[8, 1], [4, 5], [5, 3],
[3, 0], [5, 0], [6, 4],
[4, 9], [6, 4], [3, 6],
[5, 4], [9, 7], [2, 4],
[6, 2], [4, 5], [8, 3]])
rice_cluster = KMeans(n_clusters=3) #設(shè)置一個你想分的類別,定義一個聚類器
rice_cluster.fit(X) # 使用這個數(shù)據(jù)進行訓(xùn)練
label = rice_cluster.labels_
x0 = X[label == 0]
x1 = X[label == 1]
x2 = X[label == 2]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c = "blue", marker='*', label='label1')
plt.scatter(x2[:, 0], x2[:, 1], c = "green", marker='+', label='label2')
plt.show()
用起來不是很難杆兵,關(guān)鍵是我們要懂其內(nèi)在的原理雁仲,同時清楚自己要解決的問題是什么。
評價模型好壞
我們先來看看模型的中心點
rice_cluster.cluster_centers_
然后可以用已經(jīng)訓(xùn)練好的模型琐脏,去預(yù)測新的值
rice_cluster.predict([[1, 1], [5, 3],[5, 6]])
還有一個評價體系攒砖,評價模型好壞,結(jié)果與1越接近日裙,樣本聚類越合理
from sklearn import metrics
score=metrics.silhouette_score(X,label)
score
K-means 優(yōu)缺點介紹
優(yōu)點:簡單 快捷 如果簇是密集的吹艇,分類效果特別好
缺點:處理符號屬性的數(shù)據(jù)不適用、必須實現(xiàn)給出K值昂拂、對初始值有一定的要求受神,初始值設(shè)定不當(dāng),聚類結(jié)果可能不同格侯、如果有極端值鼻听,會影響平均值
K-means 算法升級
這里就不做多的介紹财著,可以自行搜索scikit-learn聚類
里面有詳細的介紹,我們要根據(jù)自己實際的數(shù)據(jù)情況選擇相應(yīng)的聚類方法撑碴。