成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

免費Python機器學習課程九:K均值聚類

人工智能 機器學習
K均值聚類是最流行和廣泛使用的無監督學習模型。它也稱為群集,因為它通過群集數據來工作。與監督學習模型不同,非監督模型不使用標記數據。

K聚類是什么意思?

K均值聚類是最流行和廣泛使用的無監督學習模型。它也稱為群集,因為它通過群集數據來工作。與監督學習模型不同,非監督模型不使用標記數據。

該算法的目的不是預測任何標簽。而是更好地了解數據集并對其進行標記。

[[360705]]

在k均值聚類中,我們將數據集聚類為不同的組。

這是k均值聚類算法的工作原理

(1) 第一步是隨機初始化一些點。這些點稱為簇質心。

免費Python機器學習課程九:K均值聚類

在上圖中,紅色和藍色點是群集質心。

您可以選擇任意數量的群集質心。但是簇質心的數量必須少于數據點的總數。

(2) 第二步是群集分配步驟。在此步驟中,我們需要遍歷每個綠點。根據點是否更靠近紅色或藍色點,我們需要將其分配給其中一個點。

換句話說,根據綠色點是紅色還是藍色來著色,具體取決于它是靠近藍色簇質心還是紅色簇質心。

免費Python機器學習課程九:K均值聚類

(3) 下一步是移動群集質心。現在,我們必須對分配給紅色聚類質心的所有紅點取平均值,然后將紅色聚類質心移至該平均值。我們需要對藍色簇質心執行相同的操作。

現在,我們有了新的簇質心。我們必須回到編號2(集群分配步驟)。我們需要將點重新排列到新的群集質心。在那之后重復第三。

數字2和3需要重復幾次,直到兩個聚類質心都位于合適的位置,如下圖所示。

免費Python機器學習課程九:K均值聚類

看,我們只是按照分配給它們的簇質心對所有綠色點進行了著色。藍色簇質心位于藍色簇的中心,紅色簇質心位于紅色簇的中心。

當我們開發該算法時,將會稍微清楚一點。我們將對此進行更詳細的討論。

開發算法

我將用于此算法的數據集是從安德魯·伍(Andrew Ng)在Coursera的機器學習課程中獲得的。這是開發k均值算法的分步指南:

(1) 導入必要的包和數據集

  1. import pandas as pd 
  2. import numpy as np 
  3. df1 = pd.read_excel('dataset.xlsx', sheet_name='ex7data2_X'header=None
  4. df1.head() 
免費Python機器學習課程九:K均值聚類

數據集只有兩列。我采用了兩個特色數據集,因為它很容易可視化。當您看到視覺效果時,該算法將對您更容易理解。但是,相同的算法也將適用于多維數據集。

我將DataFrame df1轉換為Numpy數組,因為我們將在此過程中處理其他數組:

  1. X = np.array(df1) 

現在,我將按照上面討論的三個步驟進行操作。

(2) 第一步是隨機初始化質心。

我將從數據集中隨機初始化三個點。首先,我將在0和數據集長度之間選擇三個數字。

  1. import randomrandominit_centroids = random.sample(range(0, len(df1)), 3) 
  2. init_centroids 

輸出:

  1. [95, 30, 17] 

使用這三個數字作為索引,并獲取這些索引的數據點。

  1. centroids = [] 
  2. for i in init_centroids: 
  3.     centroids.append(df1.loc[i]) 
  4. centroids 

輸出:

  1. [0 3.907793 
  2. 1 5.094647 
  3. Name: 95, dtype: float64, 
  4. 0 2.660466 
  5. 1 5.196238 
  6. Name: 30, dtype: float64, 
  7. 0 3.007089 
  8. 1 4.678978 
  9. Name: 17, dtype: float64] 

這三點是我們最初的質心。

我將它們轉換為二維數組。因為這是我比較熟悉的格式。

  1. centroids = np.array(centroids) 

輸出:

  1. array([[3.90779317, 5.09464676], 
  2. [2.66046572, 5.19623848], 
  3. [3.00708934, 4.67897758]]) 

(3) 實施群集分配步驟。

在這一步中,我們將遍歷數據集中的所有數據點。

一個數據點表示一行數據

讓我們看一行數據,了解如何將這些數據分配給集群。

我們將計算所有三個質心的數據距離。然后將該數據點分配給距離最短的質心。

如我們所見,我們必須計算兩個點之間的許多距離。讓我們開發一個計算距離的函數。

  1. def calc_distance(X1, X2): 
  2.     return(sum((X1 - X2)**2))**0.5 

開發一個函數,將每個數據點分配給一個質心。我們的"質心"數組只有三個值。因此,我們有三個索引:0、1、2。我們將為每個數據點分配這些索引之一。

  1. def findClosestCentroids(ic, X): 
  2.     assigned_centroid = [] 
  3.     for i in X: 
  4.         distance=[] 
  5.         for j in ic: 
  6.             distance.append(calc_distance(i, j)) 
  7.         assigned_centroid.append(np.argmin(distance)) 
  8.     return assigned_centroid 

此功能是將數據點分配給群集的功能。讓我們使用此函數來計算每個數據點的質心:

  1. get_centroids = findClosestCentroids(centroids, X) 
  2. get_centroids 

部分輸出:

  1. [2, 
  2. 0, 
  3. 0, 
  4. 2, 
  5. 1, 
  6. 2, 
  7. 2, 
  8. 2, 
  9. 1, 
  10. 1, 
  11. 2, 
  12. 2, 
  13. 2, 
  14. 2, 
  15. 2, 
  16. 2, 
  17. 0, 

總輸出很長。因此,我在這里顯示部分輸出。輸出中的第一個質心為2,這意味著將其分配給質心列表的索引2。

(4) 最后一步是根據數據點的平均值移動質心

在這一步中,我們將取每個質心的所有數據點的平均值,然后將質心移動到該平均值。

例如,我們將在索引2處找到分配給質心的所有點的平均值,然后將質心2移至平均值。對索引0和1的質心也執行相同的操作。

讓我們定義一個函數來做到這一點:

  1. def calc_centroids(clusters, X): 
  2.     new_centroids = [] 
  3.     new_df = pd.concat([pd.DataFrame(X), pd.DataFrame(clusters, columns=['cluster'])], 
  4.                       axis=1
  5.     for c in set(new_df['cluster']): 
  6.         current_cluster = new_df[new_df['cluster'] == c][new_df.columns[:-1]] 
  7.         cluster_mean = current_cluster.mean(axis=0
  8.         new_centroids.append(cluster_mean) 
  9.     return new_centroids 

這些都是我們需要開發的所有功能。

正如我之前所討論的,我們需要重復此群集分配過程,并多次移動質心,直到質心處于合適的位置。

對于此問題,我選擇重復此過程10次。我將在每次迭代后繼續繪制質心和數據,以直觀地向您展示其工作方式。

  1. for i in range(10): 
  2.     get_centroids = findClosestCentroids(centroids, X) 
  3.     centroids = calc_centroids(get_centroids, X) 
  4.     #print(centroids) 
  5.     plt.figure() 
  6.     plt.scatter(np.array(centroids)[:, 0], np.array(centroids)[:, 1], color='black'
  7.     plt.scatter(X[:, 0], X[:, 1], alpha=0.1) 
  8.     plt.show() 
免費Python機器學習課程九:K均值聚類

經過五次迭代,將質心設置為其最佳位置。因此,他們此后不再更改職位。

我建議,在嘗試降維之前,請運行上面的所有代碼以使其學習好。

否則,您可能會感到不知所措!另外,由于我們已經詳細解釋了該算法,因此我現在將加快執行速度。

降維

我想解釋一下這種算法的至少一個用例。一種非常有用的用例是降維。

想一想圖像。圖像中可能有太多不同的像素。在任何計算機視覺問題中,如果我們可以縮小圖片的尺寸,則設備讀取該圖片的速度將大大提高!是不是

我們可以使用剛剛開發的算法來縮小圖片的尺寸。

我將使用青蛙的圖片來說明這一點:

免費Python機器學習課程九:K均值聚類

> Image By Author

我將這張照片上傳到了與筆記本相同的文件夾中。讓我們導入這個:

  1. import cv2 
  2. im = cv2.imread('frog.png') 
  3. im 

輸出:

  1. array([[[  2,  57,  20], 
  2.         [  2,  57,  20], 
  3.         [  2,  57,  21], 
  4.         ..., 
  5.         [  0,   5,   3], 
  6.         [  8,  12,  11], 
  7.         [ 91,  94,  93]],       [[  2,  56,  20], 
  8.         [  1,  54,  20], 
  9.         [  1,  56,  19], 
  10.         ..., 
  11.         [  0,   2,   1], 
  12.         [  7,   9,   8], 
  13.         [ 91,  92,  91]],       [[  2,  55,  20], 
  14.         [  2,  53,  19], 
  15.         [  1,  54,  18], 
  16.         ..., 
  17.         [  2,   4,   2], 
  18.         [  8,  11,   9], 
  19.         [ 91,  93,  91]],       ...,       [[  6,  76,  27], 
  20.         [  6,  77,  26], 
  21.         [  6,  78,  28], 
  22.         ..., 
  23.         [  6,  55,  18], 
  24.         [ 13,  61,  25], 
  25.         [ 94, 125, 102]],       [[  9,  79,  31], 
  26.         [ 11,  81,  33], 
  27.         [ 12,  82,  32], 
  28.         ..., 
  29.         [  6,  56,  19], 
  30.         [ 14,  61,  27], 
  31.         [ 96, 126, 103]],       [[ 43, 103,  63], 
  32.         [ 44, 107,  66], 
  33.         [ 46, 106,  66], 
  34.         ..., 
  35.         [ 37,  81,  50], 
  36.         [ 47,  88,  59], 
  37.         [118, 145, 126]]], dtype=uint8

檢查數組的形狀,

  1. im.sgape 

輸出:

  1. (155, 201, 3) 

我將整個數組除以255,以使所有值從0到1。

然后將其重塑為155 * 201 x 3,使其成為二維數組。因為我們之前開發了二維數組的所有函數。

  1. im = (im/255).reshape(155*201, 3) 

如您在上方所見,有許多不同的像素值。我們要減少它并僅保留10像素值。

讓我們初始化10個隨機索引,

  1. randomrandom_index = random.sample(range(0, len(im)), 10) 

現在,像上一個示例一樣找到質心:

  1. centroids = [] 
  2. for i in random_index: 
  3.     centroids.append(im[i]) 
  4. centroids = np.array(centroids) 

輸出:

  1. array([[0.00392157, 0.21176471, 0.06666667], 
  2. [0.03529412, 0.2627451 , 0.09803922], 
  3. [0.29411765, 0.3254902 , 0.26666667], 
  4. [0.00784314, 0.18431373, 0.05882353], 
  5. [0.29019608, 0.49411765, 0.28235294], 
  6. [0.5254902 , 0.61176471, 0.48627451], 
  7. [0.04313725, 0.23921569, 0.09803922], 
  8. [0.00392157, 0.23529412, 0.0745098 ], 
  9. [0.00392157, 0.20392157, 0.04705882], 
  10. [0.22352941, 0.48235294, 0.40784314]]) 

現在,我也將" im"轉換為數組,

  1. im = np.array(im) 

數據準備就緒。現在,我們可以繼續進行集群過程。但是這次,我將不進行可視化。因為數據不再是二維的。因此,可視化并不容易。

  1. for i in range(20): 
  2.     get_centroids = findClosestCentroids(centroids, im) 
  3.     centroids = calc_centroids(get_centroids, im) 

我們現在得到了更新的質心。

  1. centroids 

輸出:

  1. [0 0.017726 
  2. 1 0.227360 
  3. 2 0.084389 
  4. dtype: float64, 
  5. 0 0.119791 
  6. 1 0.385882 
  7. 2 0.247633 
  8. dtype: float64, 
  9. 0 0.155117 
  10. 1 0.492051 
  11. 2 0.331497 
  12. dtype: float64, 
  13. 0 0.006217 
  14. 1 0.048596 
  15. 2 0.019410 
  16. dtype: float64, 
  17. 0 0.258289 
  18. 1 0.553290 
  19. 2 0.406759 
  20. dtype: float64, 
  21. 0 0.728167 
  22. 1 0.764610 
  23. 2 0.689944 
  24. dtype: float64, 
  25. 0 0.073519 
  26. 1 0.318513 
  27. 2 0.170943 
  28. dtype: float64, 
  29. 0 0.035116 
  30. 1 0.273665 
  31. 2 0.114766 
  32. dtype: float64, 
  33. 0 0.010810 
  34. 1 0.144621 
  35. 2 0.053192 
  36. dtype: float64, 
  37. 0 0.444197 
  38. 1 0.617780 
  39. 2 0.513234 
  40. dtype: float64] 

這是最后一步。我們只會保留這10點。

如果還打印get_centroids,您將看到集群分配。

現在,我們要遍歷整個數組" im",并將數據更改為其相應的簇質心值。這樣,我們將僅具有這些質心值。

我不想更改原始數組,而是要制作一個副本并在那里進行更改。

  1. imim_recovered = im.copy() 
  2. for i in range(len(im)): 
  3.     im_recovered[i] = centroids[get_centroids[i]] 

您還記得,我們在一開始就更改了圖像的尺寸,使其成為二維數組。我們現在需要將其更改為原始形狀。

  1. im_recoveredim_recovered = im_recovered.reshape(155, 201, 3) 

在這里,我將并排繪制原始圖像和縮小后的圖像,以顯示差異:

  1. im1 = cv2.imread('frog.png') 
  2. import matplotlib.image as mpimg 
  3. fig,ax = plt.subplots(1,2) 
  4. ax[0].imshow(im1) 
  5. ax[1].imshow(im_recovered) 

免費Python機器學習課程九:K均值聚類

> Image by Author

看,我們如此大地減小了圖像的尺寸。不過,它看起來像只青蛙!但是計算機閱讀起來會快得多!

結論

在本文中,我解釋了k均值聚類的工作原理以及如何從頭開始開發k均值聚類算法。我還解釋了如何使用此算法來縮小圖像尺寸。請嘗試使用其他圖像。

這是我在本文中使用的數據集的鏈接。

https://github.com/rashida048/Machine-Learning-With-Python/blob/master/kmean.xlsx

這個是代碼:

https://github.com/rashida048/Machine-Learning-With-Python/blob/master/k_mean_clustering_final.ipynb

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2023-12-01 16:27:05

機器學習無監督學習

2024-05-27 00:05:00

2020-12-24 06:54:45

Python機器學習多類分類邏輯回歸

2020-12-19 10:54:25

機器學習線性回歸算法

2020-12-23 07:54:56

Python機器學習邏輯回歸算法

2020-12-20 20:31:56

Python機器學習多元線性回歸

2020-05-13 15:57:59

聚類分析算法監督學習

2020-12-25 10:08:53

Python機器學習神經網絡算法

2020-12-22 07:09:01

Python機器學習多項式回歸

2020-12-27 21:14:06

Python機器學習算法

2020-12-28 08:26:51

Python機器學習數據集

2021-01-01 14:59:51

Python機器學習算法

2018-05-28 15:33:09

無監督學習算法Python

2017-09-11 09:20:14

機器學習無監督學習聚類

2017-11-13 12:53:14

時間序列數據數據k-均值

2024-07-16 10:35:42

2018-04-08 22:32:02

2019-05-29 07:59:54

機器學習深度學習自然語言

2022-10-28 15:19:28

機器學習距離度量數據集

2025-05-22 10:06:49

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品爱久久久久久久 | 超级乱淫av片免费播放 | 涩涩导航 | 欧美国产中文字幕 | 日韩a v在线免费观看 | 午夜爽爽爽男女免费观看 | 久久综合久久综合久久 | 久久精品国产精品青草 | 免费一级网站 | 欧美激情视频网站 | 成人免费在线电影 | 色中文在线 | 免费三级av | 欧美精品一区二区三区在线 | 久久最新 | 亚洲天堂二区 | 91看片网 | 涩涩视频在线观看 | 黄色免费在线观看网站 | 天天躁日日躁狠狠躁2018小说 | 亚洲国产成人av好男人在线观看 | 欧美白人做受xxxx视频 | 中文字幕电影在线观看 | 亚洲欧美一区二区三区国产精品 | 日日干日日操 | www.成人.com| 黄色小视频入口 | 亚洲欧美精品国产一级在线 | av超碰| 黄a在线观看 | 欧美激情精品久久久久久变态 | 久久久久1 | 亚洲精品自拍视频 | 91欧美激情一区二区三区成人 | 日韩精品一区二区久久 | 亚洲精品av在线 | 一级毛片播放 | 米奇7777狠狠狠狠视频 | 成年女人免费v片 | 粉嫩粉嫩芽的虎白女18在线视频 | 一区二区精品 |