溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中K-means算法的示例分析

發(fā)布時間:2021-06-04 09:47:22 來源:億速云 閱讀:183 作者:小新 欄目:編程語言

這篇文章主要介紹了Python中K-means算法的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1、步驟說明

(1)確定K值(決定數據聚為幾類,K值是K-Means算法中唯一的參數);

(2)從原始數據集中隨機選擇K個點作為初始均值點;

(3)依次從原始數據集中取出數據,每取出一個數據就和K個均值點分別計算距離(默認計算點間的歐氏距離),和誰更近就歸為這個均值點所在的簇;

(4)分別計算各簇當前的均值點(即求該簇中所有點的平均值);

(5)比較當前的均值點和上一步得到的均值點是否相同,如果相同,則K-Means算法結束,否則,將當前的均值點替換掉之前的均值點,然后重新劃分族,重復步驟三。

2、實例

import numpy as np
import matplotlib.pyplot as plt
 
'''標志位統(tǒng)計遞歸運行次數'''
flag = 0
 
'''歐式距離'''
def ecludDist(x, y):
    return np.sqrt(sum(np.square(np.array(x) - np.array(y))))
 
'''曼哈頓距離'''
def manhattanDist(x, y):
    return np.sum(np.abs(x - y))
 
'''夾角余弦'''
def cos(x, y):
    return np.dot(x, y)/(np.linalg.norm(x) * np.linalg.norm(y))
 
'''計算簇的均值點'''
def clusterMean(dataset):
    return sum(np.array(dataset)) / len(dataset)
 
'''生成隨機均值點'''
def randCenter(dataset, k):
    temp = []
    while len(temp) < k:
        index = np.random.randint(0, len(dataset)-1)
        if  index not in temp:
            temp.append(index)
    return np.array([dataset[i] for i in temp])
 
'''以數據集的前k個點為均值點'''
def orderCenter(dataset, k):
    return np.array([dataset[i] for i in range(k)])
 
'''聚類'''
def kMeans(dataset, dist, center, k):
    global flag
    #all_kinds用于存放中間計算結果
    all_kinds = []
    for _ in range(k):
        temp = []
        all_kinds.append(temp)
    #計算每個點到各均值點的距離  
    for i in dataset:
        temp = []
        for j in center:
            temp.append(dist(i, j))
        all_kinds[temp.index(min(temp))].append(i)
    #打印中間結果    
    for i in range(k):
        print('第'+str(i)+'組:', all_kinds[i], end='\n')
    flag += 1
    print('************************迭代'+str(flag)+'次***************************')
    #更新均值點
    center_ = np.array([clusterMean(i) for i in all_kinds])
    if (center_ == center).all():
        print('結束')
        for i in range(k):
            print('第'+str(i)+'組均值點:', center_[i], end='\n')
            plt.scatter([j[0] for j in all_kinds[i]], [j[1] for j in all_kinds[i]], marker='*')
        plt.grid()
        plt.show()
    else:
        #遞歸調用kMeans函數
        center = center_
        kMeans(dataset, dist, center, k)
 
def main(k):
    '''生成隨機點'''
    x = [np.random.randint(0, 50) for _ in range(50)]
    y = [np.random.randint(0, 50) for _ in range(50)]
    points = [[i,j] for i, j in zip(x, y)]
    plt.plot(x, y, 'b.')
    plt.show()
    initial_center = randCenter(dataset=points, k=k)
    kMeans(dataset=points, dist=ecludDist, center=initial_center, k=k)
 
if __name__ == '__main__':
    main(3)

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python中K-means算法的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI