您好,登錄后才能下訂單哦!
這篇文章主要介紹了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 '''標志位統計遞歸運行次數''' 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算法的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。