KMeans聚类

import numpy as np
import pandas as pd

data = pd.read_csv("order.csv")
#去掉不需要的列
data = data.iloc[:,-8:]
class KMeans:
    """使用python实现聚类算法"""
    def __init__(self,k,times):
        """初始化方法:
        Parameters
        ----
        k:int
            聚类个数
        times:int
            聚类迭代次数
        """
        self.k = k
        self.times = times
    
    def fit(self,X):
        """根据提供的训练数据,对模型进行训练。
        Parameters:
        ----
        X:类数组类型,形状为:[样本数量,特征数量]
            待训练的样本特征属性
        """
        X = np.asarray(X)
        #设置随机种子,保证随机序列可以重复出现
        np.random.seed(0)
        #随机产生k个聚类点(组),作为初始聚类中心
        self.cluster_centers_ = X[np.random.randint(0,len(X),self.k)]
        #存放点所属的组
        self.labels_ = np.zeros(len(X))
        for t in range(self.times):
            for index ,x in enumerate(X):
                #计算每个样本与聚类中心的距离
                dis = np.sqrt(np.sum((x - self.cluster_centers_) ** 2,axis = 1))
                #将最小距离的索引赋值给标签数组,索引的值就是当前所属的簇,范围为[0,k-1]
                self.labels_[index] = np.argmin(dis)
            #循环遍历每一个簇,计算均值,更新聚类中心
            for i in range(self.k):
                self.cluster_centers_[i] = np.mean(X[self.labels_ == i],axis=0)
    
    def predict(self,X):
        """根据参数传递的样本,对样本进行预测。(样本属于哪一个簇中)
        Parameters:
        X: 类数组类型,形状[样本数量,特征数量]
            带预测样本的特征属性
        Returns:
        ----
        result:数组类型
            预测的结果,每个X所属的类别
        """
        X = np.asarray(X)
        result = np.zeros(len(X))
        for index,x in enumerate(X):
            #计算样本到每个聚类中心的距离
            dis = np.sqrt(np.sum((x-self.cluster_centers_) ** 2,axis = 1))
            #找到聚类中心,划分类别
            result[index] = dis.argmin()
        return result
kmeans = KMeans(3,50)
kmeans.fit(data)
display(kmeans.cluster_centers_)
display(data[kmeans.labels_ == 0])
kmeans.predict()

 

你可能感兴趣的:(机器学习算法)