非监督学习
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?非監督學習
1 什么是非監(unsupervised learning)督學習
無監督學習,就是不受監督的學習,一種自由的學習方式。該學習方式不需要先驗知識進行指導,而是不斷地自我認知,自我鞏固,最后進行自我歸納,在機器學習中,無監督學習可以被簡單理解為不為訓練集提供對應的類別標識(label),其與有監督學習的對比如下: 有監督學習(Supervised Learning)下的訓練集:(x(1),y(1)),(x(2),y2)(x(1),y(1)),(x(2),y2)無監督學習(Unsupervised Learning)下的訓練集:(x(1)),(x(2)),(x(3))(x(1)),(x(2)),(x(3))在有監督學習中,我們把對樣本進行分類的過程稱之為分類(Classification),而在無監督學習中,我們將物體被劃分到不同集合的過程稱之為聚類(Clustering)。
2?非監督學習步驟
假設現在又1千個數據,有x1,x2兩個特征,現在對這1000個數據進行聚類,首先聚類的話有多少個類別就聚成多少類,假設K是把數據劃分成多少個類別,這個個數是根據業務來定的,這個K值有兩種情況,一種是知道個數,一種是不知道,不知道個數的話就相當于超參數。
假設知道K為3,那么怎么做呢?①隨機在數據中抽取3個樣本,當做3個類別的中心點(k1,k2,k3);
②計算其余的點分別到這3個中心點的距離,每一個樣本有3個距離(a,b,c),從中選出一個距離最近的點作為自己的標記,形成3個族群;
③分別計算這3個族群的平均值,把3個平均值與之前的3個舊中心點進行比較,如果相同,結束聚類,如果不同把這3個平均值當做新的中心點,重復第二步。
3?非監督學習之k-means
K-means通常被稱為勞埃德算法,這在數據聚類中是最經典的,也是相對容易理解的模型。
K-means算法執行的過程分為如下4個階段:
①隨機設置K個特征空間內的點作為初始的聚類中心 ;
②對于其他每個點計算到K個中心的距離,未知的點選擇最近的一個聚類 中心點作為標記類別 ;
③接著對著標記的聚類中心之后,重新計算出每個聚類的新中心點(平 均值) ;
④如果計算得出的新中心點與原中心點一樣,那么結束,否則重新進行 第二步過程
4 k-means API
sklearn.cluster.KMeans
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
k-means聚類? ? ? ? ? ? ? ? ? ? n_clusters:開始的聚類中心數量 (就是把這些樣本分成多少個類別)
init:初始化方法,默認為'k-means ++’? ? ? ? ? ? ? ? ? ? labels_:默認標記的類型,可以和真實值比較(不是值比較)
方法:
? ? ? ? ? ?fit(X,y=None)使用X作為訓練數據擬合模型
? ? ? ? ? ?predict(X)預測新的數據所在的類別
屬性:
? ? ? ? ? ?clustercenters集群中心的點坐標
? ? ? ? ? ?labels_每個點的類別
聚類是做在分類之前的,有的數據沒有目標值的時候,應該先做聚類,然后再預測類別。
?
5 Kmeans性能評估指標
假設分為3個類別如下圖,當聚類的時候最好的結果非常相似的樣本變成一個類別,那也就是說外部距離是最大的,內部這些樣本是非常相似的。所以外部距離(族群與族群之間的距離),越大是越好的,內部各樣本之間距離越小越好,這就是聚類的目的。
評估標準就是輪廓系數。那么是怎么評估的呢?對于每一個樣本都是有輪廓系數的,假設有一點藍1,①計算藍1到自身類別的點的距離的平均值記做ai;②分別計算藍1到紅色類別和綠色類別所有點的距離取出平均值b1,b2,取出最小值當做bi;③藍1的輪廓系數就為(bi-ai)/(max(bi ai));④在極端情況下,假設聚類非常好,外部距離非常大,內部距離非常小,那么bi>>ai(bi遠大于ai)那么輪廓系數就為1,如果情況最差ai>>bi,那么輪廓系數就為-1,所以每一個樣本的輪廓系數在[-1,1]區間,越靠近1是越好的
Kmeans性能評估指標API?sklearn.metrics.silhouette_score
sklearn.metrics.silhouette_score(X, labels) 計算所有樣本的平均輪廓系數
X:特征值
labels:被聚類標記的目標值
?
6 案例
from sklearn.datasets import load_digits from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 加載數據 ld = load_digits()# 聚類 k = KMeans(n_clusters=4) k.fit_transform(ld.data) print("每個點的類別",k.labels_[:20]) print("評論聚類效果的輪廓系數",silhouette_score(ld.data,k.labels_))7 總結
特點分析:采用迭代式算法(一步一步修改中心點),直觀易懂并且非常實用
缺點:容易收斂到局部最優解(多次聚類) ? ? ? ? ? ? ?
需要預先設定簇的數量(k-means++解決)
總結
- 上一篇: Java入门篇 2021/02/22
- 下一篇: Flink的Table API 与SQL