『『ML』利用』利用K-Means聚类算法对未标注数据分组聚类算法对未标注数据分组——《机器学习实战》学习笔记《机器学习实战》学习笔记
((Ch10))
本节用Python实现K-Means算法,对未标注的数据进行聚类。主要参考《机器学习实战》—— Peter Harrington著。
导航导航K-Means简介代码实现(一)数据集读入(二)距离计算(三)构建随机质心(四)数据聚类(五)完整代码改进:采用二分法(一)简介(二)代码最后
K-Means简介简介
这里参考了大三专业课老师的PPT,现在回过头来看,老师当初讲得特别透彻,可惜没好好听,老师dbq (*>﹏<*)。
k-means算法,也被称为k-平均或k-均值算法,是一种使用最广泛的聚类算法。根据个体到每个类中心的距离进行划分,而类中心用类中所有个体的均值来度量。
思路及步骤:
随机或按某种策略从n个对象中选择k个对象作为初始的类中心(Centriod,Mean Point);
计算每个对象与这k个类中心的距离;
将每个对象划分/分配到与其距离最近的类中心所在的类中;并重新计算每个类的类中心。
回到第2步,直到和前一次划分/分配结果无差异,停止。
代码实现代码实现
(一)数据集读入(一)数据集读入
先查看一下 testSet.txt 数据集的格式,每一行有两个数据,用空格间隔开。
我们首先要将每一行用空格 split , 用 map 函数进行数值类型转化(转为 float 型),再保存到一个名为 dataMat 的列表中。代码如下所示:
# 读入数据,保存到列表
def loadDataSet(fileName):
dataMat = [] with open(fileName, "r", encoding='utf-8') as fn:
for line in fn.readlines():
curLine = line.strip().split(' ')
fltLine = list(map(float, curLine)) # 数值类型转化,map()会根据提供的函数对指定序列做映射
dataMat.append(fltLine)
return dataMat
注:map ( ) 函数在 Python 2.x 返回列表,在 Python 3.x 返回迭代器,因此代码中用list()进行转换。效果如下:
(二)距离计算(二)距离计算
采用欧式距离进行计算,也可以使用其他计算方法。
# 计算距离
def distCal(vecA, vecB):
return np.sqrt(np.sum(np.power(vecA - vecB, 2)))
# vecA, vecB都为数组的形式,类似于[1 2] # power(x1, x2)数组的元素分别求n次方。x2可以是数字,也可以是数组,但是x1和x2的列数要相同。
(三)构建随机质心(三)构建随机质心
这一步用来随机生成质心。
质心的表示与原数据相同,原数据保存的格式类似为[[1, 4], [-3, 3], [4, -1], ...] ,因此首先获取到每一行的数据有几个,用 shape [1] 来获取,得到 n 为2。
接下来生成 k * n 的矩阵,用来保存 k 个质心。
评论0
最新资源