1. 程式人生 > 程式設計 >k-means 聚類演算法與Python實現程式碼

k-means 聚類演算法與Python實現程式碼

k-means 聚類演算法思想先隨機選擇k個聚類中心,把集合裡的元素與最近的聚類中心聚為一類,得到一次聚類,再把每一個類的均值作為新的聚類中心重新聚類,迭代n次得到最終結果分步解析

一、初始化聚類中心

首先隨機選擇集合裡的一個元素作為第一個聚類中心放入容器,選擇距離第一個聚類中心最遠的一個元素作為第二個聚類中心放入容器,第三、四、、、N個同理,為了優化可以選擇距離開方做為評判標準

二、迭代聚類

依次把集合裡的元素與距離最近的聚類中心分為一類,放到對應該聚類中心的新的容器,一次聚類完成後求出新容器裡個類的均值,對該類對應的聚類中心進行更新,再次進行聚類操作,迭代n次得到理想的結果

三、視覺化展示

利用 python 第三方庫中的視覺化工具 matplotlib.pyplot 對聚類後的元素顯示(散點圖),方便檢視結果

python程式碼實現

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__":
  ## 生成二維隨機座標(如果有資料集就更好)
  arr = np.random.randint(100,size=(100,1,2))[:,:]

  ## 初始化聚類中心和聚類容器
  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()

結果展示

聚m=5類,迭代n=20次

總結

到此這篇關於k-means 聚類演算法與Python實現程式碼的文章就介紹到這了,更多相關k-means 聚類演算法python內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!