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()