机器学习_KMeans聚类算法的学习(Python实现)
程序员文章站
2022-07-14 20:18:25
...
Kmeans算法是最常用的聚类算法。
主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。
其训练数据的流程是:
根据上面的流程图来实现具体代码:
数据集提取链接
链接:https://pan.baidu.com/s/1hqS9BOfwICAZ9IfTz5_BCA
提取码:zlyi
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
class KMeans:
def __init__(self, k, times):
self.k = k
self.times = times
self.cluster_centers = None
self.labels = None
def fit(self, X):
X = np.asarray(X)
# 通过设置随机种子可以保证每次运行得到的随机序列是相同的,随机种子也可以是别的数,不一定为0
np.random.seed(0)
# 随机选择聚类中心
self.cluster_centers = X[np.random.randint(0, len(X), self.k)]
# 初始化标签为0
self.labels = np.zeros(len(X))
for i in range(self.times):
for index, x in enumerate(X):
# 计算每个点与聚类中心的距离
dis = np.sqrt(np.sum((x - self.cluster_centers) ** 2, axis=1))
# 将该样本点的标签设置为欧式距离最近的样本点
self.labels[index] = dis.argmin()
# 根据已经初步分类的结果计算均值更新簇中心,self.k为簇中心的个数
for j in range(self.k):
self.cluster_centers[j] = np.mean(X[self.labels == j], axis=0)
def predict(self, 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
if __name__ == '__main__':
data = pd.read_csv('order.csv')
t = data.iloc[:, -8:]
kmeans = KMeans(3, 50)
# 可视化代码,因为多个特征不好实现可视化,遂选取2个特征来进行可视化的实现
t2 = t.loc[:, "Food%":"Fresh%"]
kmeans.fit(t2)
# 设置可视化中文的实现,字体
mpl.rcParams['font.family'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10, 10))
# result = kmeans.predict([[30,30,40,0,0,0,0,0],[0,0,0,0,0,30,30,40],[30,30,0,0,0,0,20,20]])
# print(result) 预测的代码
# 画出各个簇的可视化图
plt.scatter(t2[kmeans.labels == 0].iloc[:, 0], t2[kmeans.labels == 0].iloc[:, 1], label='类别1')
plt.scatter(t2[kmeans.labels == 1].iloc[:, 0], t2[kmeans.labels == 1].iloc[:, 1], label='类别2')
plt.scatter(t2[kmeans.labels == 2].iloc[:, 0], t2[kmeans.labels == 2].iloc[:, 1], label='类别3')
# 簇中心用 + 画出
plt.scatter(kmeans.cluster_centers[:, 0], kmeans.cluster_centers[:, 1], marker='+', s=300)
plt.title('分析')
plt.xlabel('食物')
plt.ylabel('肉类')
plt.legend()
plt.show()
推荐阅读
-
python机器学习实战之K均值聚类
-
python机器学习库sklearn之DBSCAN密度聚类实例
-
python机器学习库sklearn的多类、多标签、多输出实例讲解
-
聊聊那些使用前端Javascript实现的机器学习类库
-
python机器学习朴素贝叶斯算法及模型的选择和调优详解
-
Python用K-means聚类算法进行客户分群的实现
-
Python机器学习之K-Means聚类实现详解
-
NLP学习(四)规则分词-正向、逆向和双向最大匹配算法的中文分词-python3实现
-
学习python基础班结束test:凯撒加密法,利用字母移位来加密字母。现在要求实现这样的一个加密和解密的类
-
机器学习之聚类算法(三)KMeans、KMeans++、KMeans||原理介绍及代码实现