自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文簡(jiǎn)述多種無(wú)監(jiān)督聚類(lèi)算法的Python實(shí)現(xiàn)

開(kāi)發(fā) 開(kāi)發(fā)工具 后端 算法
本文簡(jiǎn)要介紹了多種無(wú)監(jiān)督學(xué)習(xí)算法的 Python 實(shí)現(xiàn),包括 K 均值聚類(lèi)、層次聚類(lèi)、t-SNE 聚類(lèi)、DBSCAN 聚類(lèi)。

無(wú)監(jiān)督學(xué)習(xí)是一類(lèi)用于在數(shù)據(jù)中尋找模式的機(jī)器學(xué)習(xí)技術(shù)。無(wú)監(jiān)督學(xué)習(xí)算法使用的輸入數(shù)據(jù)都是沒(méi)有標(biāo)注過(guò)的,這意味著數(shù)據(jù)只給出了輸入變量(自變量 X)而沒(méi)有給出相應(yīng)的輸出變量(因變量)。在無(wú)監(jiān)督學(xué)習(xí)中,算法本身將發(fā)掘數(shù)據(jù)中有趣的結(jié)構(gòu)。

人工智能研究的領(lǐng)軍人物 Yan Lecun,解釋道:無(wú)監(jiān)督學(xué)習(xí)能夠自己進(jìn)行學(xué)習(xí),而不需要被顯式地告知他們所做的一切是否正確。這是實(shí)現(xiàn)真正的人工智能的關(guān)鍵!

監(jiān)督學(xué)習(xí) VS 無(wú)監(jiān)督學(xué)習(xí)

在監(jiān)督學(xué)習(xí)中,系統(tǒng)試圖從之前給出的示例中學(xué)習(xí)。(而在無(wú)監(jiān)督學(xué)習(xí)中,系統(tǒng)試圖從給定的示例中直接找到模式。)因此,如果數(shù)據(jù)集被標(biāo)注過(guò)了,這就是一個(gè)監(jiān)督學(xué)習(xí)問(wèn)題;而如果數(shù)據(jù)沒(méi)有被標(biāo)注過(guò),這就是一個(gè)無(wú)監(jiān)督學(xué)習(xí)問(wèn)題。

上圖是一個(gè)監(jiān)督學(xué)習(xí)的例子,它使用回歸技術(shù)找到在各個(gè)特征之間的最佳擬合曲線(xiàn)。而在無(wú)監(jiān)督學(xué)習(xí)中,根據(jù)特征對(duì)輸入數(shù)據(jù)進(jìn)行劃分,并且根據(jù)數(shù)據(jù)所屬的簇進(jìn)行預(yù)測(cè)。

重要的術(shù)語(yǔ)

  • 特征:進(jìn)行預(yù)測(cè)時(shí)使用的輸入變量。
  • 預(yù)測(cè)值:給定一個(gè)輸入示例時(shí)的模型輸出。
  • 示例:數(shù)據(jù)集中的一行。一個(gè)示例包含一個(gè)或多個(gè)特征,可能還有一個(gè)標(biāo)簽。
  • 標(biāo)簽:特征對(duì)應(yīng)的真實(shí)結(jié)果(與預(yù)測(cè)相對(duì)應(yīng))。

準(zhǔn)備無(wú)監(jiān)督學(xué)習(xí)所需的數(shù)據(jù)

在本文中,我們使用 Iris 數(shù)據(jù)集來(lái)完成初級(jí)的預(yù)測(cè)工作。這個(gè)數(shù)據(jù)集包含 150 條記錄,每條記錄由 5 個(gè)特征構(gòu)成——花瓣長(zhǎng)度、花瓣寬度、萼片長(zhǎng)度、萼片寬度、花的類(lèi)別?;ǖ念?lèi)別包含 Iris Setosa、Iris VIrginica 和 Iris Versicolor 三種。本文中向無(wú)監(jiān)督算法提供了鳶尾花的四個(gè)特征,預(yù)測(cè)它屬于哪個(gè)類(lèi)別。

本文使用 Python 環(huán)境下的 sklearn 庫(kù)來(lái)加載 Iris 數(shù)據(jù)集,并且使用 matplotlib 進(jìn)行數(shù)據(jù)可視化。以下是用于探索數(shù)據(jù)集的代碼片段:

  1. # Importing Modules 
  2. from sklearn import datasets 
  3. import matplotlib.pyplot as plt 
  4.  
  5. # Loading dataset 
  6. iris_df = datasets.load_iris() 
  7.  
  8. # Available methods on dataset 
  9. print(dir(iris_df)) 
  10.  
  11. # Features 
  12. print(iris_df.feature_names) 
  13.  
  14. # Targets 
  15. print(iris_df.target) 
  16.  
  17. # Target Names 
  18. print(iris_df.target_names) 
  19. label = {0: 'red', 1: 'blue', 2: 'green'} 
  20.  
  21. # Dataset Slicing 
  22. x_axis = iris_df.data[:, 0] # Sepal Length 
  23. y_axis = iris_df.data[:, 2] # Sepal Width 
  24.  
  25. # Plotting 
  26. plt.scatter(x_axis, y_axis, c=iris_df.target) 
  27. plt.show() 
  1. ['DESCR', 'data', 'feature_names', 'target', 'target_names'] 
  2. ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 
  3. [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] 
  4. ['setosa' 'versicolor' 'virginica'] 

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

聚類(lèi)分析

在聚類(lèi)分析中,數(shù)據(jù)被劃分為不同的幾組。簡(jiǎn)而言之,這一步旨在將具有相似特征的群組從整體數(shù)據(jù)中分離出來(lái),并將它們分配到簇(cluster)中。

可視化示例:

如上所示,左圖是沒(méi)有進(jìn)行分類(lèi)的原始數(shù)據(jù),右圖是進(jìn)行聚類(lèi)之后的數(shù)據(jù)(根據(jù)數(shù)據(jù)本身的特征將其分類(lèi))。當(dāng)給出一個(gè)待預(yù)測(cè)的輸入時(shí),它會(huì)基于其特征查看自己從屬于哪一個(gè)簇,并以此為根據(jù)進(jìn)行預(yù)測(cè)。

K-均值聚類(lèi)的 Python 實(shí)現(xiàn)

K 均值是一種迭代的聚類(lèi)算法,它的目標(biāo)是在每次迭代中找到局部最大值。該算法要求在最初選定聚類(lèi)簇的個(gè)數(shù)。由于我們知道本問(wèn)題涉及到 3 種花的類(lèi)別,所以我們通過(guò)將參數(shù)「n_clusters」傳遞給 K 均值模型來(lái)編寫(xiě)算法,將數(shù)據(jù)分組到 3 個(gè)類(lèi)別中?,F(xiàn)在,我們隨機(jī)地將三個(gè)數(shù)據(jù)點(diǎn)(輸入)分到三個(gè)簇中?;诿總€(gè)點(diǎn)之間的質(zhì)心距離,下一個(gè)給定的輸入數(shù)據(jù)點(diǎn)將被劃分到獨(dú)立的簇中。接著,我們將重新計(jì)算所有簇的質(zhì)心。

每一個(gè)簇的質(zhì)心是定義結(jié)果集的特征值的集合。研究質(zhì)心的特征權(quán)重可用于定性地解釋每個(gè)簇代表哪種類(lèi)型的群組。

我們從 sklearn 庫(kù)中導(dǎo)入 K 均值模型,擬合特征并進(jìn)行預(yù)測(cè)。

K 均值算法的 Python 實(shí)現(xiàn):

  1. # Importing Modules 
  2. from sklearn import datasets 
  3. from sklearn.cluster import KMeans 
  4.  
  5. # Loading dataset 
  6. iris_df = datasets.load_iris() 
  7.  
  8. # Declaring Model 
  9. model = KMeans(n_clusters=3
  10.  
  11. # Fitting Model 
  12. model.fit(iris_df.data) 
  13.  
  14. # Predicitng a single input 
  15. predicted_label = model.predict([[7.2, 3.5, 0.8, 1.6]]) 
  16.  
  17. # Prediction on the entire data 
  18. all_predictions = model.predict(iris_df.data) 
  19.  
  20. # Printing Predictions 
  21. print(predicted_label) 
  22. print(all_predictions) 
  1. [0] 
  2. [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] 

層次聚類(lèi)

層次聚類(lèi),顧名思義,是一種能夠構(gòu)建有層次的簇的算法。在這個(gè)算法的起始階段,每個(gè)數(shù)據(jù)點(diǎn)都是一個(gè)簇。接著,兩個(gè)最接近的簇合二為一。最終,當(dāng)所有的點(diǎn)都被合并到一個(gè)簇中時(shí),算法停止。

層次聚類(lèi)的實(shí)現(xiàn)可以用 dendrogram 進(jìn)行展示。接下來(lái),我們一起來(lái)看一個(gè)糧食數(shù)據(jù)的層次聚類(lèi)示例。數(shù)據(jù)集鏈接:

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

1. 層次聚類(lèi)的 Python 實(shí)現(xiàn):

  1. # Importing Modules 
  2. from scipy.cluster.hierarchy import linkage, dendrogram 
  3. import matplotlib.pyplot as plt 
  4. import pandas as pd 
  5.  
  6. # Reading the DataFrame 
  7. seeds_df = pd.read_csv( 
  8.  "https://raw.githubusercontent.com/vihar/unsupervised-learning-with-python/master/seeds-less-rows.csv") 
  9.  
  10. # Remove the grain species from the DataFrame, save for later 
  11. varieties = list(seeds_df.pop('grain_variety')) 
  12.  
  13. # Extract the measurements as a NumPy array 
  14. samples = seeds_df.values 
  15.  
  16. """ 
  17. Perform hierarchical clustering on samples using the 
  18. linkage() function with the method='complete' keyword argument. 
  19. Assign the result to mergings. 
  20. """ 
  21. mergings = linkage(samples, method='complete'
  22.  
  23. """ 
  24. Plot a dendrogram using the dendrogram() function on mergings, 
  25. specifying the keyword arguments labels=varietiesleaf_rotation=90
  26. and leaf_font_size=6
  27. """ 
  28. dendrogram(mergings, 
  29.  labels=varieties
  30.  leaf_rotation=90
  31.  leaf_font_size=6
  32.  ) 
  33.  
  34. plt.show() 

2. K 均值和層次聚類(lèi)之間的差別

  • 層次聚類(lèi)不能很好地處理大數(shù)據(jù),而 K 均值聚類(lèi)可以。原因在于 K 均值算法的時(shí)間復(fù)雜度是線(xiàn)性的,即 O(n);而層次聚類(lèi)的時(shí)間復(fù)雜度是平方級(jí)的,即 O(n2)。
  • 在 K 均值聚類(lèi)中,由于我們最初隨機(jī)地選擇簇,多次運(yùn)行算法得到的結(jié)果可能會(huì)有較大差異。而層次聚類(lèi)的結(jié)果是可以復(fù)現(xiàn)的。
  • 研究表明,當(dāng)簇的形狀為超球面(例如:二維空間中的圓、三維空間中的球)時(shí),K 均值算法性能良好。
  • K 均值算法抗噪聲數(shù)據(jù)的能力很差(對(duì)噪聲數(shù)據(jù)魯棒性較差),而層次聚類(lèi)可直接使用噪聲數(shù)據(jù)進(jìn)行聚類(lèi)分析。

t-SNE 聚類(lèi)

這是一種可視化的無(wú)監(jiān)督學(xué)習(xí)方法。t-SNE 指的是 t 分布隨機(jī)鄰居嵌入(t-distributed stochastic neighbor embedding)。它將高維空間映射到一個(gè)可視化的二維或三維空間中。具體而言,它將通過(guò)如下方式用二維或三維的數(shù)據(jù)點(diǎn)對(duì)高維空間的對(duì)象進(jìn)行建模:以高概率用鄰近的點(diǎn)對(duì)相似的對(duì)象進(jìn)行建模,而用相距較遠(yuǎn)的點(diǎn)對(duì)不相似的對(duì)象進(jìn)行建模。

用于 Iris 數(shù)據(jù)集的 t-SNE 聚類(lèi)的 Python 實(shí)現(xiàn):

  1. # Importing Modules 
  2. from sklearn import datasets 
  3. from sklearn.manifold import TSNE 
  4. import matplotlib.pyplot as plt 
  5.  
  6. # Loading dataset 
  7. iris_df = datasets.load_iris() 
  8.  
  9. # Defining Model 
  10. model = TSNE(learning_rate=100
  11.  
  12. # Fitting Model 
  13. transformed = model.fit_transform(iris_df.data) 
  14.  
  15. # Plotting 2d t-Sne 
  16. x_axis = transformed[:, 0] 
  17. y_axis = transformed[:, 1] 
  18.  
  19. plt.scatter(x_axis, y_axis, c=iris_df.target) 
  20. plt.show() 

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

在這里,具備 4 個(gè)特征(4 維)的 Iris 數(shù)據(jù)集被轉(zhuǎn)化到二維空間,并且在二維圖像中進(jìn)行展示。類(lèi)似地,t-SNE 模型可用于具備 n 個(gè)特征的數(shù)據(jù)集。

DBSCAN 聚類(lèi)

DBSCAN(帶噪聲的基于密度的空間聚類(lèi)方法)是一種流行的聚類(lèi)算法,它被用來(lái)在預(yù)測(cè)分析中替代 K 均值算法。它并不要求輸入簇的個(gè)數(shù)才能運(yùn)行。但是,你需要對(duì)其他兩個(gè)參數(shù)進(jìn)行調(diào)優(yōu)。

scikit-learn 的 DBSCAN 算法實(shí)現(xiàn)提供了缺省的「eps」和「min_samples」參數(shù),但是在一般情況下,用戶(hù)需要對(duì)他們進(jìn)行調(diào)優(yōu)。參數(shù)「eps」是兩個(gè)數(shù)據(jù)點(diǎn)被認(rèn)為在同一個(gè)近鄰中的最大距離。參數(shù)「min_samples」是一個(gè)近鄰中在同一個(gè)簇中的數(shù)據(jù)點(diǎn)的最小個(gè)數(shù)。

1. DBSCAN 聚類(lèi)的 Python 實(shí)現(xiàn):

  1. # Importing Modules 
  2. from sklearn.datasets import load_iris 
  3. import matplotlib.pyplot as plt 
  4. from sklearn.cluster import DBSCAN 
  5. from sklearn.decomposition import PCA 
  6.  
  7. # Load Dataset 
  8. iris = load_iris() 
  9.  
  10. # Declaring Model 
  11. dbscan = DBSCAN() 
  12.  
  13. # Fitting 
  14. dbscan.fit(iris.data) 
  15.  
  16. # Transoring Using PCA 
  17. pca = PCA(n_components=2).fit(iris.data) 
  18. pcapca_2d = pca.transform(iris.data) 
  19.  
  20. # Plot based on Class 
  21. for i in range(0, pca_2d.shape[0]): 
  22.  if dbscan.labels_[i] == 0: 
  23.  c1 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='r'marker='+'
  24.  elif dbscan.labels_[i] == 1: 
  25.  c2 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='g'marker='o'
  26.  elif dbscan.labels_[i] == -1: 
  27.  c3 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='b'marker='*'
  28.  
  29. plt.legend([c1, c2, c3], ['Cluster 1', 'Cluster 2', 'Noise']) 
  30. plt.title('DB 

2. 更多無(wú)監(jiān)督學(xué)習(xí)技術(shù):

  • 主成分分析(PCA)
  • 異常檢測(cè)
  • 自編碼器
  • 深度信念網(wǎng)絡(luò)
  • 赫布型學(xué)習(xí)
  • 生成對(duì)抗網(wǎng)絡(luò)(GAN)
  • 自組織映射

原文鏈接:

https://towardsdatascience.com/unsupervised-learning-with-python-173c51dc7f03

【本文是51CTO專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2017-05-15 11:10:10

大數(shù)據(jù)聚類(lèi)算法

2022-04-18 09:16:47

層次聚類(lèi)Python代碼

2024-10-18 17:14:13

2023-03-03 08:26:32

負(fù)載均衡算法服務(wù)

2018-07-29 06:46:07

神經(jīng)網(wǎng)絡(luò)RNN循環(huán)神經(jīng)網(wǎng)絡(luò)

2023-12-01 16:27:05

機(jī)器學(xué)習(xí)無(wú)監(jiān)督學(xué)習(xí)

2017-08-21 10:00:23

遺傳算法Python生物學(xué)

2020-06-24 12:01:16

Python數(shù)據(jù)類(lèi)字符

2023-11-13 15:01:28

機(jī)器學(xué)習(xí)

2023-01-03 09:45:23

無(wú)人駕駛技術(shù)

2017-10-25 19:05:18

深度學(xué)習(xí)語(yǔ)音分離

2022-04-26 10:27:52

機(jī)器算法KNN數(shù)據(jù)

2021-10-13 19:39:26

鴻蒙HarmonyOS應(yīng)用

2017-06-12 14:04:45

深度學(xué)習(xí)人工智能

2017-07-06 17:03:45

BP算法Python神經(jīng)網(wǎng)絡(luò)

2018-07-20 14:58:16

深度學(xué)習(xí)梯度下降損失函數(shù)

2017-09-11 09:20:14

機(jī)器學(xué)習(xí)無(wú)監(jiān)督學(xué)習(xí)聚類(lèi)

2018-04-23 14:49:31

表征句子深度學(xué)習(xí)自然語(yǔ)言

2020-07-09 15:26:18

Python聚類(lèi)算法語(yǔ)言

2019-03-27 09:00:00

人工智能AI算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)