[譯] Python 中的無監督學習算法

無監督學習是一種用於在數據中查找模式的機器學習技術。提供給無監督算法的數據是沒有標記的,這意味着只給出輸入變量(X)而沒有相應的輸出變量。在無監督學習中,算法本身來發現數據中有趣的結構。html

人工智能研究主任 Yan Lecun 解釋說,無監督學習 —— 在不明確告訴他們所作的一切是對仍是錯的狀況下教機器自我學習 —— 是「真正的」人工智能的關鍵所在。前端

監督學習 Vs 無監督學習。

在監督學習中,系統試圖從先前給出的示例中學習。(另外一方面,在無監督學習中,系統會嘗試直接從給定的示例中查找模式。)所以,若是數據集被標記則爲監督問題,若是數據集未標記,則是無監督問題。python

srcandroid

上面的圖像是監督學習的一個例子; 咱們使用迴歸算法找到特徵之間的最佳擬合線。在無監督學習中,輸入的數據以特徵爲基礎而被分隔成不一樣的羣集,而且預測它所屬的羣集。ios

重要術語

Feature: 用於進行預測的輸入變量。git

Predictions: 輸入示例時的模型輸出。github

Example: 一行數據集。一個 example 包含一個或多個特徵以及可能的標籤。算法

Label: 特徵結果。編程

無監督學習數據準備

在本文中,咱們使用鳶尾花(Iris)數據集進行第一次預測。數據集包含一組有 150 個記錄的集合,擁有 5 個屬性 —— 花瓣長度、花瓣寬度、萼片長度、萼片寬度和類別。Iris Setosa、Iris Virginica 和 Iris Versicolor 是這三個類別。在咱們的無監督算法中,咱們給出了鳶尾花的這四個特徵並預測它屬於哪一個類別。後端

咱們使用 Python 中的 sklearn 庫來加載鳶尾花數據集,使用 matplotlib 庫來實現數據可視化。如下是用於研究數據集的代碼段。

# 引入模塊
from sklearn import datasets
import matplotlib.pyplot as plt

# 加載數據集
iris_df = datasets.load_iris()

# 數據集上的可用方法
print(dir(iris_df))

# 特徵
print(iris_df.feature_names)

# 目標
print(iris_df.target)

# 目標名稱
print(iris_df.target_names)
label = {0: 'red', 1: 'blue', 2: 'green'}

# 數據集切片
x_axis = iris_df.data[:, 0]  # Sepal Length
y_axis = iris_df.data[:, 2]  # Sepal Width

# 繪製
plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()
複製代碼
['DESCR', 'data', 'feature_names', 'target', 'target_names']
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

['setosa' 'versicolor' 'virginica']
複製代碼

紫色:Setosa,綠色: Versicolor,黃色:Virginica

聚類

在羣集中,數據分爲幾組。簡而言之,目的是將具備類似特徵的羣體分開並將其分配到對應的羣集中。

可視化的例子,

在上圖中,左邊的圖像是未進行分類的原始數據,右邊的圖像是聚類的(數據根據其特徵進行分類)。當給出要預測的輸入時,它根據它的特徵檢查它所屬的羣集,並進行預測。

Python 中的 K-均值 聚類算法

K 均值是一種迭代聚類算法,旨在在每次迭代中找到局部最大值。最初選擇所需數量的羣集。因爲咱們知道涉及 3 個類別,所以咱們將算法編程爲將數據分組爲 3 個類別,方法是將參數 「n_clusters」 傳遞給咱們的 K 均值模型。如今隨機將三個點(輸入)分配到三個羣集中。基於每一個點之間的質心距離,下一個給定的輸入被分配到相應的羣集。如今,從新計算全部羣集的質心。

羣集的每一個質心都是一組特徵值,用於定義結果組。檢查質心特徵權重可用於定性地解釋每一個羣集表明什麼類型的組。

咱們從 sklearn 庫導入 K 均值模型,擬合特徵並預測。

Python 中的 K 均值算法實現。

# 引入模塊
from sklearn import datasets
from sklearn.cluster import KMeans

# 加載數據集
iris_df = datasets.load_iris()

# 聲明模型
model = KMeans(n_clusters=3)

# 擬合模型
model.fit(iris_df.data)

# 預測單個輸入
predicted_label = model.predict([[7.2, 3.5, 0.8, 1.6]])

# 預測整個數據
all_predictions = model.predict(iris_df.data)

# 打印預測結果
print(predicted_label)
print(all_predictions)
複製代碼
[0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 1 1 2]
複製代碼

分層聚類

顧名思義,分層聚類是一種構建聚類層次結構的算法。該算法從分配給本身的羣集的全部數據開始。而後將兩個最接近的羣集合併到同一羣集中。最後,當只剩下一個羣集時,該算法結束。

可使用樹形圖顯示分層聚類的完成過程。如今讓咱們看一下穀物數據的層次聚類的例子。數據集能夠在這裏找到。

Python 中分層聚類算法的實現。

# 引入模塊
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
import pandas as pd

# 讀入 DataFrame
seeds_df = pd.read_csv(
    "https://raw.githubusercontent.com/vihar/unsupervised-learning-with-python/master/seeds-less-rows.csv")

# 從 DataFrame 中刪除穀物種類,稍後再保存
varieties = list(seeds_df.pop('grain_variety'))

# 將測量值提取爲 NumPy 數組
samples = seeds_df.values

""" 使用帶有 method ='complete' 關鍵字參數的 linkage()函數對樣本執行分層聚類。 將結果合併。 """
mergings = linkage(samples, method='complete')

""" 在合併時使用 dendrogram() 函數繪製樹形圖, 指定關鍵字參數 labels = varieties,leaf_rotation = 90 和 leaf_font_size = 6。 """
dendrogram(mergings,
           labels=varieties,
           leaf_rotation=90,
           leaf_font_size=6,
           )

plt.show()
複製代碼

K 均值和分層聚類之間的差別

  • 分層聚類不能很好地處理大數據,但 K 均值聚類能夠。這是由於 K 均值的時間複雜度是線性的,即 O(n),而分層聚類的時間複雜度是二次的,即 O(n2)。
  • 在 K 均值聚類中,當咱們從任意選擇的聚類開始時,經過屢次運行算法生成的結果可能會有所不一樣。然而在分層聚類中結果是可重現的。
  • 當羣集的形狀是超球形時(如 2D 中的圓圈,3D 中的球體),咱們發現 K 均值工做良好。
  • K-均值不容許噪聲數據,而在分層聚類中咱們能夠直接使用噪聲數據集進行聚類。

t-SNE聚類

它是可視化的無監督學習方法之一。t-SNE 表明 t 分佈的隨機嵌入鄰域。它將高維空間映射到能夠可視化的 2 維或 3 維空間。具體地,它經過二維或三維點對每一個高維對象建模,使得類似對象由附近點建模,而非類似對象由遠點以高几率建模。

用於鳶尾花數據集的 Python 中的 t-SNE 聚類實現

# 引入模塊
from sklearn import datasets
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# 加載數據集
iris_df = datasets.load_iris()

# 定義模型
model = TSNE(learning_rate=100)

# 擬合模型
transformed = model.fit_transform(iris_df.data)

# 繪製二維的 t-Sne
x_axis = transformed[:, 0]
y_axis = transformed[:, 1]

plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()
複製代碼

紫色:Setosa,綠色:Versicolor,黃色:Virginica

這裏,因爲鳶尾花數據集具備四個特徵(4d),所以它被轉換並以二維圖形表示。相似地,t-SNE 模型能夠應用於具備 n 個特徵的數據集。

DBSCAN 聚類

DBSCAN(具備噪聲的基於密度的聚類方法)是一種流行的聚類算法,用於替代預測分析中的 K 均值。它不須要輸入羣集的數量就能運行。可是,你必須調整另外兩個參數。

scikit-learn 實現提供了 eps 和 min_samples 參數的默認值,可是你一般須要調整這些參數。eps 參數是要在同一鄰域中考慮的兩個數據點之間的最大距離。min_samples 參數是鄰域中被視爲羣集的數據點的最小數量。

Python 中的 DBSCAN 聚類

# 引入模塊
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA

# 加載數據集
iris = load_iris()

# 聲明模型
dbscan = DBSCAN()

# 擬合
dbscan.fit(iris.data)

# 使用PCA進行轉換
pca = PCA(n_components=2).fit(iris.data)
pca_2d = pca.transform(iris.data)

# 基於類別進行繪製
for i in range(0, pca_2d.shape[0]):
    if dbscan.labels_[i] == 0:
        c1 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='r', marker='+')
    elif dbscan.labels_[i] == 1:
        c2 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='g', marker='o')
    elif dbscan.labels_[i] == -1:
        c3 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='b', marker='*')

plt.legend([c1, c2, c3], ['Cluster 1', 'Cluster 2', 'Noise'])
plt.title('DBSCAN finds 2 clusters and Noise')
plt.show()
複製代碼

更多無監督技術:

  • 主成分分析 (PCA)
  • 異常檢測
  • 自動編碼
  • 深度信念網絡
  • 赫布型學習
  • 生成式對抗網絡(GANs)
  • 自組織映射

重要連接:

Python 中的監督學習算法.

後記

感謝閱讀。若是你發現這篇文章有用,請點擊下面的 ❤️ 來傳遞愛吧。

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索