iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
AI & Data

深入探索AI模型系列 第 20

【Day 20】 K-means Clustering實作

  • 分享至 

  • xImage
  •  

今天我們要用python的sklearn來實作K-means,首先我們先利用python的random套件來隨機產生資料點,筆者這邊隨機產生了100個x座標介於0到100且y座標介於0到100的資料點。

import random

coordinates = []
for _ in range(100):
    coordinates.append([random.randint(0, 100), random.randint(0, 100)])

https://ithelp.ithome.com.tw/upload/images/20230820/20150784ynQSHbFtJP.png

下一步我們直接使用skleanr.cluster裡的KMeans函式來建構K-means模型,這邊選擇的分群為3,讀者們可以調整看看分群的數量,看看有什麼樣不同的結果。建構完成過後,就可以直接將先前產生的隨機點放進模型去做訓練。

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters = 3)
kmeans.fit(coordinates)

訓練完成過後可以使用predict函式來對資料預測是哪一個分群或是在訓練時使用fit_predict函式,可以訓練後直接回傳分群結果。筆者這邊利用了python的matplotlib.pyplot對預測結果做圖,直接圖像化來清楚的看見分群結果。

import matplotlib.pyplot as plt

predictions = kmeans.predict(coordinates)
for i, prediction in enumerate(predictions):
    if (prediction == 1):
        plt.plot(coordinates[i][0], coordinates[i][1], "bo")
    elif (prediction == 2):
        plt.plot(coordinates[i][0], coordinates[i][1], "go")
    else:
        plt.plot(coordinates[i][0], coordinates[i][1], "yo")
        
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230820/20150784X4IjhcHGxX.png

從結果來看,好像我們做出來的結果還不錯,但是這其實是建立在我們的資料沒有離群值(outlier)的情況之下。以下的例子,筆者將一點離群值加入coordinates之中再重新訓練一次模型,可以看到最後得出來的結果好像跟我們期望的就有點差別了。所以資料預處理其實是很重要的,在訓練模型前,我們應該先檢查資料的可靠度,對資料進行刪減過後再做訓練。

coordinates.append([1000, 1000])

kmeans = KMeans(n_clusters = 3)
predictions = kmeans.fit_predict(coordinates)

for i, prediction in enumerate(predictions):
    if (prediction == 1):
        plt.plot(coordinates[i][0], coordinates[i][1], "bo")
    elif (prediction == 2):
        plt.plot(coordinates[i][0], coordinates[i][1], "go")
    else:
        plt.plot(coordinates[i][0], coordinates[i][1], "yo")
        
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230820/201507842iEaupsBIz.png


上一篇
【Day 19】 K-means Clustering(K平均分群法)
下一篇
【Day 21】 KNN(K Nearest Neighbors K-近鄰分群法)
系列文
深入探索AI模型30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言