K_means均值聚类的源代码和理解

K_means均值聚类的源代码和理解

源码

#聚类算法
import numpy as np
class KMeans:
    def __init__(self,n_clusters=5,max_iter=15):#n_clusters=5,就是k=5,max_iter=15 最大迭代次数
        self._n_clusters=n_clusters
        self._X=None
        self._y=None
        self._center = None
        self._max_iter=max_iter

    def fit(self,X):
        self._X=X
        n=X.shape[0]
        d=X.shape[1]
        #随机生成中心点
        self._center = np.array([[np.random.uniform(mi,mx) for mi,mx in zip(X.min(axis=0),X.max(axis=0))] for _ in range(self._n_clusters)])
        step=0
        #迭代
        while step < self._max_iter:
            #求样本点与每个中心点的距离
            distances = np.array([np.sum((X-self._center[i,:])**2,axis=1) for i in range(self._n_clusters)])
            #样本距离哪个最近中心点
            self._y = np.argmin(distances.T,axis=1)
            #对样本点加权平均计算新的中心点
            self._center = np.array([np.mean(X[self._y==i,:],axis=0) for i in range(self._n_clusters)])
            step+=1
            #显示中间过程
            plt.figure()
            plt.scatter(X[self._y==0,0],X[self._y==0,1],marker='+')
            plt.scatter(X[self._y==1,0],X[self._y==1,1],marker='+')
            plt.scatter(X[self._y==2,0],X[self._y==2,1],marker='+')
            #plt.scatter(X[self._y==3,0],X[self._y==3,1],marker='+')
            plt.scatter(self._center[0,0],self._center[0,1])
            plt.scatter(self._center[1,0],self._center[1,1])
            plt.scatter(self._center[2,0],self._center[2,1])
            #plt.scatter(self._center[3,0],self._center[3,1])
            plt.show()

        return self

莺尾花数据做测试

#聚类算法 莺尾花数据
from sklearn import datasets
import matplotlib.pyplot as plt
iris = datasets.load_iris()
X=iris.data[:,2:]
km1=KMeans(n_clusters=3)
km1.fit(X)

结果

莺尾花数据聚类过程

代码的简要步骤

1、随机生成K个中心点
2、算每一个样本点到K个中心点的距离
3、距离哪个中心点最近就属于那一类
4、对同一类加权算出新的中心点
5、终止条件:1、迭代次数够了
          2、中心点变化够小

具体步骤的举例理解

生成五个二维的点,简化数据跟容易理解。用五个点来完成k_means聚类的过程。
生成随机点
求距离
选最近
计算新的中心点
显示过程
缺点:只能聚圆形簇,过于确定性,缺乏概率性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值