午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

【Python實戰(zhàn)】無監(jiān)督學(xué)習—聚類、層次聚類、t-SNE,DBSCAN

 LibraryPKU 2018-06-19

【導(dǎo)讀】本文主要介紹了無監(jiān)督學(xué)習在Python上的實踐,圍繞著無監(jiān)督學(xué)習,講述了當前主流的無監(jiān)督聚類方法:數(shù)據(jù)準備,聚類,K-Means Python實現(xiàn),層次聚類和其Python實現(xiàn),t-SNE聚類,DBSCAN 聚類。并且附上作者自己的經(jīng)驗總結(jié),博文附完整詳細代碼,建議大家收藏學(xué)習!


作者 | Vihar Kurama

編譯 | 專知

整理 | Mandy, Shengsheng


 

Unsupervised Learning with Python


無監(jiān)督學(xué)習是一類機器學(xué)習技術(shù),用來發(fā)現(xiàn)數(shù)據(jù)中的模式。注意:在無監(jiān)督算法中,數(shù)據(jù)是沒有標注的,即只給出輸入變量(X),不給出相應(yīng)的輸出變量。無監(jiān)督學(xué)習是讓算法自己去發(fā)現(xiàn)數(shù)據(jù)中有趣的結(jié)構(gòu)。


人工智能科學(xué)家Yan Lecun解釋說,無監(jiān)督學(xué)習——讓機器自己學(xué)習,而不必被明確告知他們所做的每件事是對是錯——是“真正的”人工智能的關(guān)鍵。


監(jiān)督學(xué)習VS無監(jiān)督學(xué)習


在監(jiān)督學(xué)習中,系統(tǒng)試圖從之前給出的例子中學(xué)習。然而,在無監(jiān)督學(xué)習中,系統(tǒng)試圖直接從給出的示例中找到模式。如果數(shù)據(jù)集被標記了,則是一個監(jiān)督學(xué)習的問題,如果數(shù)據(jù)集沒有被標記,那么它就是一個無監(jiān)督學(xué)習的問題。

左邊的圖像是監(jiān)督學(xué)習的一個例子;我們使用回歸方法找到特征之間的最佳擬合線。右邊的圖像是無監(jiān)督學(xué)習的一個例子;在無監(jiān)督學(xué)習中,輸入是基于特征進行分離的,預(yù)測是基于它屬于哪個簇(cluster)。


重要術(shù)語


特征(Feature):用于進行預(yù)測的輸入變量。


預(yù)測(Predictions):當提供輸入示例時,模型的輸出。


示例(Example):數(shù)據(jù)集的一行。一個示例包含一個或多個特征, 可能還有一個標簽。


標簽(Label):特征的結(jié)果。


為無監(jiān)督學(xué)習準備數(shù)據(jù)


在本文中,我們使用Iris數(shù)據(jù)集進行第一次預(yù)測。該數(shù)據(jù)集包含一組具有5個屬性的150條記錄,這5個屬性為花瓣長度、花瓣寬度、萼片長度、萼片寬度和類別。Iris Setosa, Iris Virginica和Iris Versicolor是三個類。對于我們的無監(jiān)督算法,我們給出了Iris花的四個特征,并預(yù)測了它屬于哪個類。


我們使用Python中的sklearn庫加載Iris數(shù)據(jù)集,使用matplotlib進行數(shù)據(jù)可視化。下面是用于處理數(shù)據(jù)集的代碼部分。

# Importing Modules
from sklearn import datasets
import matplotlib.pyplot as plt

# Loading dataset
iris_df = datasets.load_iris()

# Available methods on dataset
print(dir(iris_df))

# Features
print(iris_df.feature_names)

# Targets
print(iris_df.target)

# Target Names
print(iris_df.target_names)
label = {0: 'red', 1: 'blue', 2: 'green'}

# Dataset Slicing
x_axis = iris_df.data[:, 0] # Sepal Length
y_axis = iris_df.data[:, 2] # Sepal Width

# Plotting
plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()


輸出結(jié)果:

['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 00 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 11 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 22 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


聚類(Clustering)


在聚類中,數(shù)據(jù)被分成幾個組。簡單來說:目的是將具有相似特征的群體分開并將它們賦予不同的簇(cluster)中。


可視化的例子,  

在上圖中,左邊的圖像是未進行分類的原始數(shù)據(jù),右邊的圖像是聚類的結(jié)果(根據(jù)數(shù)據(jù)的特征對數(shù)據(jù)進行劃分)。當給定一個要預(yù)測的輸入時,它將根據(jù)其特征在簇(cluster)中檢查其所屬哪一個類別,并進行預(yù)測。


Python中的K-Means聚類


K-Means是一種迭代聚類算法,旨在找到每次迭代中的局部最大值。由于我們知道涉及3個類,因此我們通過將參數(shù)“n_clusters”傳遞到KMeans模型中,對算法進行編程,將數(shù)據(jù)分組為3個類。


現(xiàn)在隨機的三個樣本點(輸入)被分配到三個簇(cluster)中。然后后面樣本點和這每一個點算一下質(zhì)心距離(centroid distance),然后選出并放入最優(yōu)的簇(cluster)中。然后,重新計算所有簇(cluster)的centroids。


每一個聚類的中心是定義這一組樣本點的特征值的集合,檢查中心特征權(quán)重可以解釋每一個簇(cluster)代表的類型。


我們從sklearn庫中導(dǎo)入KMeans模型,擬合特征并進行預(yù)測。


K-Means在Python中的實現(xiàn):

# Importing Modules
from sklearn import datasets
from sklearn.cluster import KMeans

# Loading dataset
iris_df = datasets.load_iris()

# Declaring Model
model = KMeans(n_clusters=3)

# Fitting Model
model.fit(iris_df.data)

# Predicitng a single input
predicted_label = model.predict([[7.2, 3.5, 0.8, 1.6]])

# Prediction on the entire data
all_predictions = model.predict(iris_df.data)

# Printing Predictions
print(predicted_label)
print(all_predictions)


輸出結(jié)果:

[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
]


層次聚類(Hierarchical Clustering)


顧名思義,層次聚類是一種構(gòu)建聚類層次結(jié)構(gòu)的算法。該算法從分配給自己簇(cluster)的所有數(shù)據(jù)開始。然后將兩個最近的簇(cluster)連接到同一個簇(cluster)中。最后,當只剩下一個簇(cluster)時,該算法就結(jié)束了。


層次聚類的完成可以用dendrogram來表示?,F(xiàn)在讓我們看一個grain谷粒數(shù)據(jù)層次聚類的例子。


數(shù)據(jù)集地址:

https://raw./vihar/unsupervised-learning-with-python/master/seeds-less-rows.csv.

 

Python中的層次聚類實現(xiàn):

# Importing Modules
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
import pandas as pd

# Reading the DataFrame
seeds_df = pd.read_csv(
'https://raw./vihar/
unsupervised-learning-with-python/master/seeds-less-rows.csv'
)

# Remove the grain species from the DataFrame, save for later
varieties = list(seeds_df.pop('grain_variety'))

# Extract the measurements as a NumPy array
samples = seeds_df.values

'''
Perform hierarchical clustering on samples using the
linkage() function with the method='complete' keyword argument.
Assign the result to mergings.
'''
mergings = linkage(samples, method='complete')

'''
Plot a dendrogram using the dendrogram() function on mergings,
specifying the keyword arguments labels=varieties, leaf_rotation=90,
and leaf_font_size=6.
'''
dendrogram(mergings,
         
labels=varieties,
         
leaf_rotation=90,
         
leaf_font_size=6,
         
)

plt.show()


輸出結(jié)果:


K-Means與層次聚類的區(qū)別


  • 層次聚類不能很好地處理大數(shù)據(jù),但K-Means聚類可以。這是因為K-Means的時間復(fù)雜度是線性的,即O(n),而層次聚類的時間復(fù)雜度是二次方,即O(n2)。


  • 在K-Means聚類中,因為我們初始化的時候,會任意選擇不同的簇(cluster),所以多次運行算法產(chǎn)生的結(jié)果可能會有所不同。然而層次聚類中是可重現(xiàn)的。


  • 當簇(cluster)的形狀是超球形時(如2D中的圓,3D中的球),K-Means表現(xiàn)地很好。


  • K-Means不允許嘈雜的數(shù)據(jù),而在層次中我們可以直接使用有噪聲的數(shù)據(jù)集進行聚類。


t-SNE聚類


它是一種無監(jiān)督學(xué)習可視化的方法。t-SNE表示t-distributed stochastic neighborembedding。


它將高維空間映射到可以可視化的二維或三維空間。具體地說,它通過一個二維或三維點對每個高維對象進行建模,其方式是相似的對象由附近的點建模,而不相似的對象則由高概率的遠點建模。


具體可以查看專知以前的t-SNE詳解:

你真的會用 t-SNE 么?有關(guān) t-SNE 的小技巧


Python中,基于Iris數(shù)據(jù)集的t-SNE聚類實現(xiàn):

# Importing Modules
from sklearn import datasets
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# Loading dataset
iris_df = datasets.load_iris()

# Defining Model
model = TSNE(learning_rate=100)

# Fitting Model
transformed = model.fit_transform(iris_df.data)

# Plotting 2d t-Sne
x_axis = transformed[:, 0]
y_axis = transformed[:, 1]

plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()


輸出結(jié)果: 

其中,紫羅蘭色:Setosa,綠色:Versicolor,黃色:Virginica


這里Iris數(shù)據(jù)集具有四個特征(4d),它被變換并以二維圖形表示。類似地,t-SNE模型可以應(yīng)用于具有n個特征的數(shù)據(jù)集。


DBSCAN聚類


DBSCAN(Density-Based Spatial Clusteringof Applications with Noise,具有噪聲的基于密度的聚類方法)是一種流行的聚類算法,用于替代預(yù)測分析中的K-means。它不要求您輸入簇(cluster)的個數(shù)才能運行。但作為交換,你必須調(diào)整其他兩個參數(shù)(eps和min_samples)。


DBSCAN算法的目的在于過濾低密度區(qū)域,發(fā)現(xiàn)稠密度樣本點。跟傳統(tǒng)的基于層次的聚類和劃分聚類的凸形聚類簇不同,該算法可以發(fā)現(xiàn)任意形狀的聚類簇,與傳統(tǒng)的算法相比它有如下優(yōu)點:

(1)與K-MEANS比較起來,不需要輸入要劃分的聚類個數(shù);


(2)聚類簇的形狀沒有偏倚;


(3)可以在需要時輸入過濾噪聲的參數(shù);


scikit-learn為eps和min_samples參數(shù)提供了一個默認值,但通常需要對它們進行優(yōu)化。eps是在同一鄰域中考慮的兩個數(shù)據(jù)點之間的最大距離。min_samples指的是簇(cluster)在鄰域中數(shù)據(jù)點數(shù)量的最小數(shù)目。


DBSCAN聚類的Python實現(xiàn):

# Importing Modules
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA

# Load Dataset
iris = load_iris()

# Declaring Model
dbscan = DBSCAN()

# Fitting
dbscan.fit(iris.data)

# Transoring Using PCA
pca = PCA(n_components=2).fit(iris.data)
pca_2d = pca.transform(iris.data)

# Plot based on Class
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()


輸出結(jié)果:

更多無監(jiān)督方法:


主成分分析(PCA)

異常檢測(Anomaly detection)

自編碼(Autoencoders)

深度置信網(wǎng)絡(luò)(Deep BeliefNets)

Hebbian Learning

生成對抗網(wǎng)絡(luò)(GANs)

自組織映射(Self-Organizingmaps)


原文鏈接:

https:///unsupervised-learning-with-python-173c51dc7f03

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多