Kmeans算法手动实现

Kmeans算法流程

背景:平面上有两堆数据(数据以(x,y)的二维坐标形式表示),目标是找出两堆数据的中心点

算法步骤

  1. 随机生成两个点作为两堆数据的中心点
  2. 计算所有点分别到两个中心点的距离
  3. 对于平面的每一个点,比较到哪一个中心点的距离近,就被归为哪一类
  4. 对于归类后的数据重新计算中心点的坐标
  5. 判断中心点是否有明显变化,如果有,跳转到2,如果没有,跳转到6
  6. 程序结束,输出中心点的坐标

下面是用python代码实现

from sklearn.datasets import make_blobs
import matplotlib.pyplot  as plt
import numpy as np

#KMeans算法实现原理
def k_means():
    X,y = make_blobs(n_samples=150,random_state=170,centers=2)

    a_point = np.array([-12,-8])
    b_point = np.array([-2,2])

    tol = True #容忍度,是否继续程序的迭代

    while tol:
        a_lens = np.linalg.norm(X - a_point,axis = 1) #计算所有点到a点的距离
        b_lens = np.linalg.norm(X - b_point,axis = 1) #计算所有点到b点的距离

        a_sets = X[a_lens < b_lens]
        b_sets = X[b_lens < a_lens]

        a_new_point = a_sets.mean(axis = 0) #计算分类后的新的中心点的坐标
        b_new_point = b_sets.mean(axis = 0) #计算分类后的新的中心点的坐标

        #计算新的中心点和上次计算的中心点对比,有无明显位移
        tol_move = np.linalg.norm(a_new_point - a_point) + np.linalg.norm(b_new_point - b_point)

        #如果位移不明显,跳出循环,1.0是对于明显性的容忍度,根据需要设置
        if tol_move < 1.0:
            tol = False

        a_point = a_new_point
        b_point = b_new_point

    return a_point,b_point

print(k_means())
注:因为系统中有Kmeans这个函数,所以不能和系统中的函数重名,因为python中有已定义的函数,实现如下
from sklearn.cluster import KMeans

#使用系统Kmeans方法进行聚类
X,y = make_blobs(n_samples=150,random_state=170,centers=2)
km = KMeans(n_clusters=2,random_state=170).fit(X)
#打印聚类后的中心
print(km.cluster_centers_)
#原始数据的聚类结果
print(km.predict(X))

希望对大家有帮助

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值