手写kmeans

import numpy as np
import random

class KMeans():
    def __init__(self,n_cluster,max_iters=100):
        """
        :param n_cluster:聚类中心个数
        :param max_iters: 最大迭代次数
        """
        self.n_cluster = n_cluster
        self.max_iters = max_iters

    # 初始化聚类中心
    def initCentroids(self,X):
        m = X.shape[0] # 样本点的个数
        m_arr = list(np.arange(m))
        indices = random.sample(m_arr, self.n_cluster) # 随机从样本点中选K个作为初始聚类中心
        return X[indices,:]

    # 计算样本点到聚类中心的距离,然后划分簇,看每个样本属于哪个簇
    def splitClass(self,X,centroids):
        distance = np.zeros((X.shape[0],self.n_cluster)) # distance[i][j]存储第i个样本到第j个聚类中心的点
        for i in range(X.shape[0]):
            for j in range(self.n_cluster):
                distance[i][j] = sum((centroids[j,:]-X[i,:])**2)
        classes = np.argmin(distance,axis=1) # 每个样本点所属的类别

        return classes

    # 更新类中心
    def computeCentroids(self,X,classes):
        centroids = np.zeros((self.n_cluster, X.shape[1]))
        for i in range(self.n_cluster):
            centroids[i,:] = np.mean(X[classes==i,:],axis=0)
        return centroids

    # 聚类过程
    def fit(self,X):
        centroids = self.initCentroids(X)
        print("initial centers:", centroids)
        for i in range(self.max_iters):
            print('迭代次数:',i)
            classes = self.splitClass(X,centroids)
            centroids = self.computeCentroids(X,classes)

        return centroids


if __name__ == "__main__":
    """
     example:
    """
    from matplotlib import pyplot as plt
    from sklearn.datasets import make_blobs
    X,y = make_blobs(centers=3) # make_blobs常用来测试聚类算法的效果

    kmeans = KMeans(n_cluster=3)
    centroids = kmeans.fit(X)
    print(centroids)
    plt.scatter(X[:,0], X[:,1])     # 原数据的散点图
    plt.plot(centroids[:,0],centroids[:,1],'r^',markersize=10)  # 聚类中心
    plt.show()


评论

Live Sex Cams Free