[问题背景]
关于KMeans聚类原理的动画演示,我在B站的投稿《Kmeans聚类原理 动画演示》中已作了介绍,有兴趣的朋友可以先看一下链接中的1分钟动画演示。
在[Python数据挖掘] sklearn-KMeans聚类一文中,我们调用sklearn库的KMeans聚类方法,成功对以下ANSI编码的grade.txt文本文档数据集进行了聚类:
YZN,133,108,76
ZHY,96,145,101
WYZ,132,107,60
DHY,100,102,120
CYH,139,99,93
LHY,73,149,81
ZHY,85,148,93
TQP,39,138,85
ZZL,145,112,71
HJC,101,116,118
XZY,99,98,117
[问题分析]
下面从底层实现的角度,只使用外部的random.sample和math.sqrt,无需使用numpy,逐步实现KMeans聚类算法。
完整代码如下:
针对grade.txt文本文档进行数据预处理并聚类的实例代码:
(grade.txt需要与代码的.py文件位于同一目录下)
from random import sample
from math import sqrt
# 函数名:means
# 函数接口:大列表data
# 函数功能:返回data大列表内所有点的平均点,是一个小列表
def means(data):
len_data = len(data)
len_item = len(data[0])
ret = []
for j in range(len_item):
ret_item = 0
for i in range(len_data):
ret_item += data[i][j]
ret_item /= len_data
ret.append(ret_item)
return ret
# 函数名:distance
# 函数接口:两个数据点列表data1和data2
# 函数功能:返回两个数据点的距离