前段时间学习了并行与分布式技术,为了写了篇关于KMeans算法的并行和分布式的编程写法,上网找了挺久,没想到网上并没有很多资料,那今天就来说一下我是怎么写的吧。
首先来讲一下K-Means的思想原理吧!
K-Means算法思想原理
K-means算法是根据给定 n n n个对象的数据集,构建 K K K个划分聚类方法,每个划分聚类称为簇。在这K个簇中,每个簇至少有一个数据对象,且每个数据对象有且只可属于一个簇。簇中的数据还有一个必须遵守的法则:同一个簇内的数据对象相似度高,不同簇的数据对象相似度低。这里的相似度将采用距离来衡量。
根据下图,可以看到K-means算法包括初始中心点的选择,对剩余数据对象遍历,进行相似度(距离)的计算,将相似度最高的数据点划分至该簇,重新计算中心点,再次相似度计算,直至代价函数达到最小值,即数据中心不再移动为止。
算法步骤总结
step1: 随机初始化 K K K个聚类中心点,循环Z次, ε = 1 0 − 5 \varepsilon=10^{-5} ε=10−5。
step2: 遍历其余样本点计算与各中心点的距离,选择相似度最高的聚为一类。
\step3: 计算代价函数 J J J,若 ∣ J ∣ ≤ ε |J|\leq\varepsilon ∣J∣≤ε或所有的观测值不再被分配或 k k k大于指定循环次数则退出循环, k = k + 1 k = k + 1 k=k+1。
step4: 重新计算新聚类中心点,返回step2。
接下来就是代码实现啦!
首先来看看只是用Numpy是怎么写的吧!
使用Numpy实现
为了方便理解,附上流程图如下:
Numpy的实现其实就是把所有数据丢进一个矩阵,然后算算算就好了😀
import numpy as np
import pandas as pd
# 找出最优簇选择(初始)
def initial_value(n, k):
minJ = np.min(data, axis=0