k-means 聚類算法與Python實現(xiàn)代碼
k-means 聚類算法思想先隨機選擇k個聚類中心,把集合里的元素與最近的聚類中心聚為一類,得到一次聚類,再把每一個類的均值作為新的聚類中心重新聚類,迭代n次得到最終結果分步解析
一、初始化聚類中心
首先隨機選擇集合里的一個元素作為第一個聚類中心放入容器,選擇距離第一個聚類中心最遠的一個元素作為第二個聚類中心放入容器,第三、四、、、N個同理,為了優(yōu)化可以選擇距離開方做為評判標準
二、迭代聚類
依次把集合里的元素與距離最近的聚類中心分為一類,放到對應該聚類中心的新的容器,一次聚類完成后求出新容器里個類的均值,對該類對應的聚類中心進行更新,再次進行聚類操作,迭代n次得到理想的結果
三、可視化展示
利用 python 第三方庫中的可視化工具 matplotlib.pyplot 對聚類后的元素顯示(散點圖),方便查看結果
python代碼實現(xiàn)
import numpy as np
import matplotlib.pyplot as plt
# 兩點距離
def distance(e1, e2):
return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2)
# 集合中心
def means(arr):
return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])])
# arr中距離a最遠的元素,用于初始化聚類中心
def farthest(k_arr, arr):
f = [0, 0]
max_d = 0
for e in arr:
d = 0
for i in range(k_arr.__len__()):
d = d + np.sqrt(distance(k_arr[i], e))
if d > max_d:
max_d = d
f = e
return f
# arr中距離a最近的元素,用于聚類
def closest(a, arr):
c = arr[1]
min_d = distance(a, arr[1])
arr = arr[1:]
for e in arr:
d = distance(a, e)
if d < min_d:
min_d = d
c = e
return c
if __name__=="__main__":
## 生成二維隨機坐標(如果有數(shù)據(jù)集就更好)
arr = np.random.randint(100, size=(100, 1, 2))[:, 0, :]
## 初始化聚類中心和聚類容器
m = 5
r = np.random.randint(arr.__len__() - 1)
k_arr = np.array([arr[r]])
cla_arr = [[]]
for i in range(m-1):
k = farthest(k_arr, arr)
k_arr = np.concatenate([k_arr, np.array([k])])
cla_arr.append([])
## 迭代聚類
n = 20
cla_temp = cla_arr
for i in range(n): # 迭代n次
for e in arr: # 把集合里每一個元素聚到最近的類
ki = 0 # 假定距離第一個中心最近
min_d = distance(e, k_arr[ki])
for j in range(1, k_arr.__len__()):
if distance(e, k_arr[j]) < min_d: # 找到更近的聚類中心
min_d = distance(e, k_arr[j])
ki = j
cla_temp[ki].append(e)
# 迭代更新聚類中心
for k in range(k_arr.__len__()):
if n - 1 == i:
break
k_arr[k] = means(cla_temp[k])
cla_temp[k] = []
## 可視化展示
col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon']
for i in range(m):
plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i])
plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])
plt.show()
結果展示

總結
到此這篇關于k-means 聚類算法與Python實現(xiàn)代碼的文章就介紹到這了,更多相關k-means 聚類算法python內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解sklearn?Preprocessing?數(shù)據(jù)預處理功能
這篇文章主要介紹了sklearn?Preprocessing?數(shù)據(jù)預處理功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
python目標檢測數(shù)據(jù)增強的代碼參數(shù)解讀及應用
這篇文章主要為大家介紹了python目標檢測數(shù)據(jù)增強的代碼參數(shù)解讀及應用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
Pycharm直接使用遠程服務器代碼并調(diào)試的解決方法
這篇文章主要介紹了Pycharm直接使用遠程服務器代碼并調(diào)試的解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
解讀opencv->tensorrt的數(shù)據(jù)排列方式
這篇文章主要介紹了解讀opencv->tensorrt的數(shù)據(jù)排列方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
詳解python實現(xiàn)識別手寫MNIST數(shù)字集的程序
這篇文章主要介紹了詳解python實現(xiàn)識別手寫MNIST數(shù)字集的程序,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
python的dataframe轉(zhuǎn)換為多維矩陣的方法
下面小編就為大家分享一篇python的dataframe轉(zhuǎn)換為多維矩陣的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python的Flask框架應用調(diào)用Redis隊列數(shù)據(jù)的方法
這里為大家?guī)鞵ython的Flask框架應用調(diào)用Redis隊列數(shù)據(jù)的方法,從而能夠?qū)崿F(xiàn)異步無阻塞從而提高某些實時處理情況下程序的性能,需要的朋友可以參考下2016-06-06

