机器学习-KNN算法
k近邻算法无训练步骤
输入的四个参数变量:
inX:用于分类的输入向量
dataSet:输入的训练样本集
labels:标签向量
k:参数k的定义
k-近邻算法基本程序
算法思想:对未知类别属性的特征向量分别与已知类别中的特征向量进行距离的计算;按照所得距离数值从小到大排序,选取前k个距离小的点;对挑选出来的点所属类别进行统计,返回出现频率最高的类别作为当前未知类别属性的类别分类。
def classfy(inX, dataSet, labels, k):
lendataSet = dataSet.shape[0] #计算已知数据集的点的个数
diffMat = tile(inX, (lendataSet, 1)) - dataSet #将未知类别属性扩展为和已知数据集相同的矩阵格式
sqdiffMat = diffMat * *2 #计算平方
sqdistance = sqdiffMat.sum(axis=1) #按行相加来统计未知类别属性与每个点之间的距离
distance = sqdistance * *0.5 #求得最后的距离
sortdistance = distance.argsort() #对距离进行排序
classcount = { }
for i in range (k):
votellabels = labels[sortdistance(i)] #距离最近的前k个类别的标签
classcount[votellabels] = classcount.get(votellabels, 0)+1 #对标签出现的次数进行统计
SortClassCount = sorted(classcount.iteritems(), key = operator.itemgetter(1), reverse = True) #按照出现的类别次数对标签进行排序
return SortClassCount[0][0] #返回出现类别频率最高的标签
- get函数的用法 :dict.get(key, default=None),
key–为函数要查找的值
default–如果查找的值不存在,则返回default的值 - .itemgetter(1):按照第二个元素的次序对元组进行排序;
- items()和iteritems()函数的用:
items():返回的是一个列表;
iteritems():返回的是一个迭代器。
K近邻算法示例–约会网站配对效果
将文本记录转化为NumPy的解析程序
def file2matrix( filename):
fr = open(filename)
arrayoLines = fr.readlines() #读取文件内容
numberofLines = len(arrayoLines) #统计文件中的行数
returnMat = zeros ((numberofLines, 3)) #创建一个用0填充的矩阵
classLabelVector = [ ]
index = 0
for line in arrayoLines:
line = line.strip() #截掉所有的回车字符
ListFromLine = line.split('\t') #将整行数据分割为一个元素列表
returnMat[index, :] = ListFromLine[0:3]
classLabelVector.append(int(ListFromLine[-1])) 将最后一列元素标签存储到向量矩阵中
index +=1
return returnMat, classLabelVector