kNN原理及实践
1 算法介绍
总的来说,机器学习入门的第一个算法是k-近邻算法(kNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
很多初学者,对大数据的概念都是模糊不清的,大数据是什么,能做什么,学的时候,该按照什么线路去学习,学完往哪方面发展,想深入了解,想学习的同学欢迎加入大数据学习qq群:957205962,有大量干货(零基础以及进阶的经典实战)分享给大家,并且有清华大学毕业的资深大数据讲师给大家免费授课,给大家分享目前国内最完整的大数据高端实战实用学习流程体系
2 算法流程
k-近邻算法的伪代码如下:
对未知类别属性的数据集中的每个点依次执行以下操作:
(1) 计算已知类别数据集中的点与当前点之间的距离;
(2) 按照距离递增次序排序;
(3) 选取与当前点距离最小的k个点;
(4) 确定前k个点所在类别的出现频率;
(5) 返回前k个点出现频率最高的类别作为当前点的预测分类。
3 案例实践——使用 k-近邻算法改进约会网站的配对效果
(参考机器学习实践第二章,数据来源https://www.manning.com/books/machine-learning-in-action)
4 代码
"""
Created on Dec 10, 2017
kNN: k Nearest Neighbors
Input: inX: vector to compare to existing dataset (1xN)
dataSet: size m data set of known vectors (NxM)
labels: data set labels (1xM vector)
k: number of neighbors to use for comparison
Output: the most popular class label
"""
import numpy as np
def file2matrix(filename):
# 整理数据集
fr = open(filename)
arraylines = fr.readlines() # 以列表的形式返回
numberlines = len(arraylines)
returnmat = np.zeros((numberlines, 3), dtype=float)
classtable = []
classcol = np.zeros((numberlines, 1), dtype=int)
index = 0
for line in arraylines:
line = line.strip('\n')
everyline = line.split('\t')
returnmat[index, :] = everyline[0:3]
classtable.append(everyline[-1])
if classtable[index] == 'smallDoses':
classcol[index] = 2
elif classtable[index] == 'largeDoses':
classcol[index] = 3
else:
classcol[index] = 1
index = index + 1
return returnmat, classcol
def norm(features):
# 归一化特征向量
normarray = np.zeros((features.shape[0], features.shape[1]))
for i in range(features.shape[1]):
maxvals = np.max(features[:, i])
minvals = np.min(features[:, i])
dist = maxvals-minvals
normarray[:, i] = (features[:, i]-minvals)/dist
return normarray
def classify(features, datatest, classlable, k):
# kNN算法实践
normtrain = norm(features)
normtest = norm(datatest)
a = features.shape[0]
b = features.shape[1]
c = datatest.shape[0]
votelable = []
group = {}
testlable = np.zeros((c, 1))
diffmat = np.zeros((a, b))
totaldist = np.zeros((a, 1))
for i in range(c):
for j in range(b):
diffmat[:, j] = (normtest[i, j] - normtrain[:, j])**2
totaldist[:, 0] = np.sqrt(np.sum(diffmat, axis=1))
sortdist = np.argsort(totaldist, axis=0)
for n in range(k):
votelable.append(classlable[sortdist[n]][0][0])
voteset = set(votelable)
for item in voteset:
group[item] = votelable.count(item)
lastclass = max(zip(group.values(), group.keys()))
print(group)
testlable[i] = lastclass[1]
votelable = []
group = {}
return testlable
if __name__ == '__main__':
filepath = 'E:\机器学习\机器学习实战数据\chapter2\machinelearninginaction\Ch02\datingTestSet.txt'
returnmat, classcol = file2matrix(filepath)
normarray = norm(returnmat)
features, datatest = normarray[0:900, :], normarray[900:1000, :]
testlable = classify(features, datatest, classcol[0:900], 10)
# 计算正确率
e = 0
for y in range(100):
if testlable[y] == classcol[900+y]:
e = e+1
print(e/100)
# 模型正确率为91%