scikit learn 實戰之非監督學習

2021-08-07 15:41:03 字數 3183 閱讀 6564

非監督學習(英語: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...