欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實現聚類K-means算法詳解

 更新時間:2022年07月15日 11:38:23   作者:Castria  
這篇文章主要介紹了Python實現聚類K-means算法詳解,K-means(K均值)算法是最簡單的一種聚類算法,它期望最小化平方誤差,具體詳解需要的朋友可以參考一下

K-means(K均值)算法是最簡單的一種聚類算法,它期望最小化平方誤差

:為避免運行時間過長,通常設置一個最大運行輪數或最小調整幅度閾值,若到達最大輪數或調整幅度小于閾值,則停止運行。

下面我們用python來實現一下K-means算法:我們先嘗試手動實現這個算法,再用sklearn庫中的KMeans類來實現。數據我們采用《機器學習》的西瓜數據(P202表9.1):

# 下面的內容保存在 melons.txt 中
# 第一列為西瓜的密度;第二列為西瓜的含糖率。我們要把這30個西瓜分為3類
0.697 0.460
0.774 0.376
0.634 0.264
0.608 0.318
0.556 0.215
0.403 0.237
0.481 0.149
0.437 0.211
0.666 0.091
0.243 0.267
0.245 0.057
0.343 0.099
0.639 0.161
0.657 0.198
0.360 0.370
0.593 0.042
0.719 0.103
0.359 0.188
0.339 0.241
0.282 0.257
0.748 0.232
0.714 0.346
0.483 0.312
0.478 0.437
0.525 0.369
0.751 0.489
0.532 0.472
0.473 0.376
0.725 0.445
0.446 0.459

手動實現

我們用到的庫有matplotlibnumpy,如果沒有需要先用pip安裝一下。

import random
import numpy as np
import matplotlib.pyplot as plt

下面定義一些數據:

k = 3 # 要分的簇數
rnd = 0 # 輪次,用于控制迭代次數(見上文)
ROUND_LIMIT = 100 # 輪次的上限
THRESHOLD = 1e-10 # 單輪改變距離的閾值,若改變幅度小于該閾值,算法終止
melons = [] # 西瓜的列表
clusters = [] # 簇的列表,clusters[i]表示第i簇包含的西瓜

從melons.txt讀取數據,保存在列表中:

f = open('melons.txt', 'r')
for line in f:
	# 把字符串轉化為numpy中的float64類型
    melons.append(np.array(line.split(' '), dtype = np.string_).astype(np.float64))

從 m m m個數據中隨機挑選出 k k k個,對應上面算法的第 1 1 1行:

# random的sample函數從列表中隨機挑選出k個樣本(不重復)。我們在這里把這些樣本作為均值向量
mean_vectors = random.sample(melons, k)

下面是算法的主要部分。

# 這個while對應上面算法的2-17行
while True:
    rnd += 1 # 輪次增加
    change = 0 # 把改變幅度重置為0

	# 清空對簇的劃分,對應上面算法的第3行
    clusters = []
    for i in range(k):
        clusters.append([])
    # 這個for對應上面算法的4-8行
    for melon in melons:
    	'''
    	argmin 函數找出容器中最小的下標,在這里這個目標容器是
    	list(map(lambda vec: np.linalg.norm(melon - vec, ord = 2), mean_vectors)),
    	它表示melon與mean_vectors中所有向量的距離列表。
    	(numpy.linalg.norm計算向量的范數,ord = 2即歐幾里得范數,或模長)
    	'''
        c = np.argmin(
            list(map( lambda vec: np.linalg.norm(melon - vec, ord = 2), mean_vectors))
        )
        clusters[c].append(melon)
	# 這個for對應上面算法的9-16行
    for i in range(k):
    	# 求每個簇的新均值向量
        new_vector = np.zeros((1,2))
        for melon in clusters[i]:
            new_vector += melon
        new_vector /= len(clusters[i])

        # 累加改變幅度并更新均值向量
        change += np.linalg.norm(mean_vectors[i] - new_vector, ord = 2)
        mean_vectors[i] = new_vector
	# 若超過設定的輪次或者變化幅度<預先設定的閾值,結束算法
    if rnd > ROUND_LIMIT or change < THRESHOLD:
        break
print('最終迭代%d輪'%rnd)

最后我們繪圖來觀察一下劃分的結果:

colors = ['red', 'green', 'blue']

# 每個簇換一下顏色,同時迭代簇和顏色兩個列表
for i, col in zip(range(k), colors):
    for melon in clusters[i]:
    	# 繪制散點圖
        plt.scatter(melon[0], melon[1], color = col)
plt.show()

劃分結果(由于最開始的 k k k個均值向量隨機選取,每次劃分的結果可能會不同):

完整代碼:

import random
import numpy as np
import matplotlib.pyplot as plt

k = 3
rnd = 0
ROUND_LIMIT = 10
THRESHOLD = 1e-10
melons = []
clusters = []
f = open('melons.txt', 'r')
for line in f:
    melons.append(np.array(line.split(' '), dtype = np.string_).astype(np.float64))
mean_vectors = random.sample(melons, k)

while True:
    rnd += 1
    change = 0
    clusters = []
    for i in range(k):
        clusters.append([])
    for melon in melons:
        c = np.argmin(
            list(map( lambda vec: np.linalg.norm(melon - vec, ord = 2), mean_vectors))
        )
        clusters[c].append(melon)
    for i in range(k):
        new_vector = np.zeros((1,2))
        for melon in clusters[i]:
            new_vector += melon
        new_vector /= len(clusters[i])

        change += np.linalg.norm(mean_vectors[i] - new_vector, ord = 2)
        mean_vectors[i] = new_vector

    if rnd > ROUND_LIMIT or change < THRESHOLD:
        break
print('最終迭代%d輪'%rnd)
colors = ['red', 'green', 'blue']
for i, col in zip(range(k), colors):
    for melon in clusters[i]:
        plt.scatter(melon[0], melon[1], color = col)
plt.show()

sklearn庫中的KMeans

這種經典算法顯然不需要我們反復地造輪子,被廣泛使用的python機器學習庫sklearn已經提供了該算法的實現。sklearn的官方文檔中給了我們一個示例:

>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
...               [10, 2], [10, 4], [10, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([1, 1, 1, 0, 0, 0], dtype=int32)
>>> kmeans.predict([[0, 0], [12, 3]])
array([1, 0], dtype=int32)
>>> kmeans.cluster_centers_
array([[10.,  2.],
       [ 1.,  2.]])

可以看出,X即要聚類的數據(1,2),(1,4),(1,0)等。
KMeans類的初始化參數n_clusters即簇數 k k k;
random_state是用于初始化選取 k k k個向量的隨機數種子;
kmeans.labels_即每個點所屬的簇;
kmeans.predict方法預測新的數據屬于哪個簇;
kmeans.cluster_centers_返回每個簇的中心。
我們就改造一下這個簡單的示例,完成對上面西瓜的聚類。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

X = []
f = open('melons.txt', 'r')
for line in f:
    X.append(np.array(line.split(' '), dtype = np.string_).astype(np.float64))
kmeans = KMeans(n_clusters = 3, random_state = 0).fit(X)
colors = ['red', 'green', 'blue']
for i, cluster in enumerate(kmeans.labels_):
    plt.scatter(X[i][0], X[i][1], color = colors[cluster])
plt.show()

運行結果如下,可以看到和我們手寫的聚類結果基本一致:

到此這篇關于Python實現聚類K-means算法詳解的文章就介紹到這了,更多相關Python K-means算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Scrapy-Redis結合POST請求獲取數據的方法示例

    Scrapy-Redis結合POST請求獲取數據的方法示例

    這篇文章主要給大家介紹了關于Scrapy-Redis結合POST請求獲取數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Scrapy-Redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Python生成pdf目錄書簽的實例方法

    Python生成pdf目錄書簽的實例方法

    在本篇文章里小編給大家整理了關于Python生成pdf目錄書簽的實例方法,有需要的朋友們可以學習下。
    2020-10-10
  • Python讀取本地文件并解析網頁元素的方法

    Python讀取本地文件并解析網頁元素的方法

    今天小編就為大家分享一篇Python讀取本地文件并解析網頁元素的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 關于Java中RabbitMQ的高級特性

    關于Java中RabbitMQ的高級特性

    這篇文章主要介紹了關于Java中RabbitMQ的高級特性,MQ全稱為Message Queue,即消息隊列,"消息隊列"是在消息的傳輸過程中保存消息的容器,它是典型的:生產者、消費者模型,生產者不斷向消息隊列中生產消息,消費者不斷的從隊列中獲取消息,需要的朋友可以參考下
    2023-07-07
  • Django工程的分層結構詳解

    Django工程的分層結構詳解

    在本篇文章里小編給各位分享的是關于Django工程的分層結構的相關知識點內容,有興趣的朋友們學習參考下。
    2019-07-07
  • Python腳本實現一鍵自動整理辦公文件

    Python腳本實現一鍵自動整理辦公文件

    這篇文章主要介紹了Python實現腳本一鍵自動整理辦公文件,文件下載文件夾就變得亂七八糟,整理的時候非常痛苦,巴不得有一個自動化的工具幫我歸類文檔。下面小編就給大家分享自動化整理文件的小技巧,需要的朋友可以參考一下文章內容
    2022-02-02
  • Python腳本實現蝦米網簽到功能

    Python腳本實現蝦米網簽到功能

    這篇文章主要介紹了Python腳本實現蝦米網簽到功能的方法,涉及Python調用URL模塊實現數據傳輸與處理的相關技巧,需要的朋友可以參考下
    2016-04-04
  • Python?encode()方法和decode()方法詳解

    Python?encode()方法和decode()方法詳解

    encode() 方法為字符串類型(str)提供的方法,用于將 str 類型轉換成 bytes 類型,這個過程也稱為“編碼”,這篇文章主要介紹了Python?encode()方法和decode()方法,需要的朋友可以參考下
    2022-12-12
  • python matplotlib畫圖實例代碼分享

    python matplotlib畫圖實例代碼分享

    這篇文章主要介紹了python matplotlib畫圖實例代碼分享,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Python數據報表之Excel操作模塊用法分析

    Python數據報表之Excel操作模塊用法分析

    這篇文章主要介紹了Python數據報表之Excel操作模塊用法,結合實例形式分析了XlsxWriter模塊的功能及簡單使用方法,需要的朋友可以參考下
    2019-03-03

最新評論