numpy實現kmeans算法

導言

基於numpy實現的kmeans要比基於TensorFlow的好寫,基於TensorFlow的實現可以參考我的這篇博文:https://blog.csdn.net/qq_41058526/article/details/104093115

 

具體實現

import numpy as np
import copy
import random

# 計算兩個向量之間距離
def cal_distance(a,b):
    # ** 代表乘方
    return np.sum((a-b) ** 2) ** 0.5


# 計算簇的中心
def cal_cluster_center(cluster):
    return np.mean(cluster,axis=0)


def kmeans(data,k,max_iter):
    num_iter = 1

    # 隨機找到k個初始中心點
    r_indexs = [i for i in range(len(data))]
    random.shuffle(r_indexs)
    centers = []
    for i in range(k):
        r_idx = r_indexs[i]
        centers.append(data[r_idx])

    pre_centers = copy.deepcopy(centers)

    while num_iter < max_iter:
        cluster_dict = {}
        for x in data:
            # 與每個簇心計算距離
            cluster_dist = []
            for i in range(k):
                distance = cal_distance(pre_centers[i],x)
                cluster_dist.append([i,distance])

            cluster_dist.sort(key = lambda x:x[1])
            min_cluster_idx, min_dist = cluster_dist[0]

            # 將數據添加到不同簇中
            if min_cluster_idx not in cluster_dict:
                cluster_dict[min_cluster_idx] = []
            cluster_dict[min_cluster_idx].append(x)

        # 更新簇中心
        for idx in cluster_dict.keys():
            centers[idx] = cal_cluster_center(cluster_dict[idx])

        # 如果簇中心點不再變化,那麼結束
        if(np.allclose(pre_centers,centers)):
            break
        else:
            pre_centers = copy.deepcopy(centers)

        num_iter += 1
    return cluster_dict

 

發佈了84 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章