所有源码经本人手撸实战,并一一注释。现公之于众,以免后来人踩坑!
from numpy import *
#数据清洗函数
#输入:数据源文件
#输出:格式化数据的矩阵形式
def loadDataSet(fileName):
dataMat =[]
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t')#格式化,去除空格以及制表符
#警告:原书此处为2.0版本,map返回的是地址,需转化为list类型!!!
fltLine = list(map(float,curLine))#将列表数据改为浮点型,转变为矩阵便于计算
dataMat.append(fltLine)#将清洗好的每条数据加入列表
return dataMat
#计算两个向量的欧式距离的平方(关于距离的定义可自由选择)
#输入:任意两个数据点的特征向量(要求是数值型)
def distEclud(vecA,vecB):
return sqrt(sum(power(vecA-vecB,2)))
#功能:创建一个包含K个随机质心的集合。随机质心必须在整个数据集的边界之内。
#输入:数据集,要创建的质心个数
#输出:K个质心的数据集
def randCent(dataSet,k):
n = shape(dataSet)[1]#列的数量,即特征值的维度,为循环遍历各维度最值准备
centroids = mat(zeros((k,n)))#创建K个质心矩阵
for j in range(n):#对N中每一维
minJ = min(dataSet[:,j])#获取第j维最小值
rangeJ = float(max