一. K均值算法介绍及实现
K均值算法(K-means)是无监督学习中的一种,其算法简洁容易实现,且Sklearn包中也提供了相应的模块可以直接调用。在<<机器学习实战>>书中,也对该算法进行了介绍。
常规的K-means算法在<<机器学习实战>>书中介绍如下:
k 均值 是 发现 给定 数据 集 的 k 个 簇 的 算法。 簇 个数 k 是 用户 给定 的, 每一个 簇 通过 其 质 心( centroid), 即 簇 中 所 有点 的 中心 来 描述。
下图是一个典型的例子。给定一个原始数据集(未标注的数据点的集合),通过K均值算法,可以给出哪些数据点是“相互靠的更近”而可以被归为一类(簇)的。同时也可以计算出各个类别的“中心点”,即质心。注意,“相互靠的更近”的定义,可以自己来规定,不一定要局限于数据点的几何距离。
不过该算法需要预先指定质心的数量。当然我们的目标应该是用尽可能少的质心,来更好的分隔数据点。
其伪代码如下:
*: k为最终簇(也即质心)的数量
创建 k 个 点 作为 起始 质 心( 经常 是 随机 选择)
当 任意 一个 点 的 簇 分配 结果 发生 改变 时
– 对数 据 集中 的 每个 数据 点
— 对 每个 质 心
— 计算 质 心 与 数据 点 之间 的 距离
— 将 数据 点 分配 到 距 其 最 近的 簇
– 对 每一个 簇, 计算 簇 中 所 有点 的 均值 并将 均值 作为 质 心
如果所有点的簇分配结果都没有变化,终止循环。并将最终的分配结果返回。
该伪代码的python实现已经由《机器学习实战》一书给出。下下面的代码额外加上了使用matplot绘的函数,以便将结果可视化。
from numpy import *
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
def loadDataSet(fileName):
'''
@fun: 载入文件,并将文件里的数据转化为float型
@input: fileName --- 文件地址
@return: list型的数据
注意:这里的文件是原始数据集。每一行对应了一个点。每一行有两个数据,第一个为x坐标,第二个为y坐标。两个数据由Tab分开
'''
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t') #按tab来分隔数据
fltLine = list(map(float,curLine))
dataMat.append(fltLine)
return dataMat
def distEclud(vecA, vecB):
#计算两个向量的欧式公式。将每个向量看成一个点。
return sqrt(sum(power(vecA - vecB, 2)))
def randCent(dataSet, k):
'''
@fun: 产生K个随机的质心
@input: dataSet --- 数据集
k --- 随机质心的数量
@return: matrix. 每一行为一个随机质心的坐标向量
'''
n = shape(dataSet)[1]
centroids = mat(zeros((k,n)))
for j in range(n):
minJ = min(dataSet[:,j])
maxJ=max((dataSet[:,j]))
rangeJ= float(maxJ- minJ)
centroids[:,j] = mat(minJ + rangeJ * rando