非監督學習(英語:unsupervised learning)是機器學習中十分重要的乙個分支。這是實驗課程的第一章節,將帶你了解什麼是非監督學習?並學會用 k-means 演算法完成乙個聚類實驗。
什麼是非監督學習?籠統來講,它和監督學習是乙個相對的概念。在監督學習的過程中,我們需要對訓練資料打上標籤,這是必不可少的一步。而非監督學習中,就不再不需要提前對資料進行人工標記。
舉個例子,比如我們現在有一堆動物的**。在監督學習中,我們需要提前對每張**代表的動物進行標記。這一張是狗,那一張是貓,然後再進行訓練。最後,模型對於新輸入的**,就能分清楚動物的類別。
當進行非監督學習時,就不需要提前對**進行標記了。我們只需要將所有的訓練樣本**「喂」給演算法即可。注意,這個時候和監督學習有一些不同,非監督學習只能識別出訓練樣本裡包含了幾種類別的動物,而並不能直接告訴你這只是貓,那乙隻是狗。但是,這裡的類別數量一般都不會太大,你可以手動對類別進行標記,再將資料用於其他用途。
上面這個例子中,非監督學習識別出樣本包含幾種類別,就是我們通常所說的「聚類」。
監督學習被用於解決分類和回歸問題,而非監督學習主要是用於解決聚類問題。聚類,顧名思義就是將具有相似屬性或特徵的資料聚合在一起。聚類演算法有很多,最簡單和最常用的就算是 k-means 演算法了。
k-means,中文譯作 k-均值演算法。從它的名字來講,k 代表最終將樣本資料聚合為 k 個類別。而「均值」代表在聚類的過程中,我們計算聚類中心點的特徵向量時,需要採用求相鄰樣本點特徵向量均值的方式進行。例如,我們將 x1=(x1, y1), x2=(x2, y2), x3=(x3, y3) 聚為一類時,中心點座標 o(o1, o1) 為:o1 = (x1+x2+x3)/3, o2=(y1+y2+y3)/3。
k-means 演算法在應用時,相對來上面的例子要複雜一些。現在,假設有如下圖所示的一組二維資料。接下來,我們就一步一步演示 k-means 的聚類過程。
第一步,確定要聚為幾類?也就是 k 值。假設,這裡我們想將樣本聚為 3 類。當然,你也完全可以將其聚為 2 類或 4 類,不要受到視覺上的誤導。
這裡,我們以 3 類為例。當確定聚為 3 類之後,我們在特徵空間上,隨機初始化三個類別中心。
第二步,我們依據這三個隨機初始化的中心,將現有樣本按照與最近中心點之間的距離進行歸類。圖中綠線將全部樣本劃分為三個類別。(中間小三角形是參考線,可以忽略。)
這樣,我們的樣本被劃為為三個區域。現在,我們就要用到上面提到的均值來重新求解 3 個區域對應的新的樣本中心。
如上圖所示,假設我們求解的新樣本中心為三個綠點所示的位置。然後,又重新回到上一步,根據這三個中心重新劃分樣本,再求解中心。
依次迭代,直到樣本中心變化非常小時終止。最終,就可以將全部樣本聚類為三類。
接下來,我們以 scikit-learn 提供的 k-means 演算法為例進行實驗。實驗樣本就採用上面的進行演算法過程演示的樣本資料。
首先,我們開啟 xfce 終端,通過下面的命令獲取實驗所需的 csv 資料檔案。
# 獲取實驗資料集
實驗完整**如下:
# -*- coding: utf-8 -*
from matplotlib import pyplot as plt
from sklearn.cluster import k_means
import pandas as pd
from sklearn.metrics import silhouette_score
file = pd.read_csv("cluster_data.csv", header=0)
x = file['x']
y = file['y']
defk_number
(): index =
inertia =
silhouette =
for i in range(20):
model = k_means(file, n_clusters=i + 2)
print silhouette
plt.plot(index, silhouette, "-o")
plt.plot(index, inertia, "-o")
plt.show()
defk_means_iris
(n_cluster):
model = k_means(file, n_clusters=n_cluster)
cluster_centers = model[0]
cluster_labels = model[1]
cluster_inertia = model[2]
plt.figure(figsize=(12, 6))
ax1 = plt.subplot(1, 2, 1)
ax2 = plt.subplot(1, 2, 2)
ax1.scatter(x, y, c="grey")
ax2.scatter(x, y, c=cluster_labels)
for center in cluster_centers:
ax2.scatter(center[0], center[1], marker="p", edgecolors="red")
print
"cluster_inertia: %s" % cluster_inertia
plt.show()
if __name__ == '__main__':
k_number()
k_means_iris(int(input("input clusters: ")))
實驗結果如下:
可以看到,聚類的結果已經顯示出來了,聚類中心也做了相應標記。效果還是非常不錯的。
非監督學習是機器學習中十分重要的分支之一。實際生活中,我們會遇到大量的非監督學習問題。因為對樣本資料進行人工標記是一件非常繁重的工作。許多時候,我們都會先使用非監督學習對大量的樣本進行聚類標註,然後再用標註之後的樣本去進行監督學習。
scikit learn 實戰之非監督學習 2
非監督學習 英語 unsupervised learning 是機器學習中十分重要的乙個分支。這是本實驗課程的第 2 章節,將帶你了解如何對聚類效果進行評估。本課程難度為一般,屬於初級級別課程,適合具有 python 基礎和線性代數基礎,並對機器學習中分類問題感興趣的使用者。肘部法則 wget 輪廓...
Scikit learn實戰之聚類 Kmeans
在scikit learn中,對於未標記資料的執行聚類需要使用 sklearn.cluster 模組。每乙個聚類演算法有兩個變數組成 乙個是類,它實現了fit方法從未標記的訓練資料中學習類簇 還有乙個就是函式,該函式的功能就是給它一批訓練資料,它能夠返回與每一批訓練資料相對應的類標的結果的整數集合。...
《scikit learn》隨機森林之回歸
今天我們學習下隨機森林做回歸的用法 話不多說直接上測試 看的更加清晰,總體上和回歸樹是一樣的使用流程 from sklearn.datasets import load boston from sklearn.model selection import cross val score from s...