一、KNN算法
KNN学习算法是一种常用的监督学习方法,其工作原理是:采用测量不同特征值之间的距离方法进行分类。其中kNN的三要素为,k值的选择、距离度量以及分类决策规则
一句话总结:“近朱者赤,近墨者黑”
分类任务: 使用 “投票法”,即选择这k个样本中出现最多的类别标记作为预测结果。
回归任务: 使用 “平均法”, 即将这k个样本的输出标记的平均值作为预测结果;还可以进行加权平均或加权投票,距离越近的样本权重越大。
二、KNN直观图
在二分类的基础上的性能讨论如下:
如图所示:kNN算法,虚线显示等距线;测试样本在k=1或者k=5时被判别为正例,k=3时被判别为反例。
三、算法原理(统计学习方法)
K近邻并没有显式的学习过程,也就是不需要对训练集进行学习。
四、KNN特点
- 优点: 精度高、对异常值不敏感、无数据输入假定
- 缺点: 计算复杂度高、空间复杂度高
- 适用数据范围: 数值型和标称型
五、算法实现
# 数据加载
def loadData(filename):
dataArr,labelArr = [], []
for line in open(filename).readlines():
dataLine = line.strip().split(',')
dataArr.append([int(num) for num in dataLine[1:]])
labelArr.append(int(dataLine[0]))
return dataArr,labelArr
def calcDist(x1, x2):
# 欧式距离
return np.sqrt(np.sum(np.square(x1-x2)))
#马哈顿距离计算公式
# return np.sum(x1 - x2)
def getClosest(trainDataMat, trainLabelMat, x, topK):
distList = [0] * len(trainDataMat)
# 迭代计算与测试数据的距离
for i in range(len(trainDataMat)):
x1 = trainDataMat[i]
curDist = calcDist(x1, x)
distList[i] = curDist
# 下标升序排序
topKList = np.argsort(np.array(distList))[:topK]
labelList = [0] * 10
for index in topKList:
labelList[int(trainLabelMat[index])] += 1
# 返回类别标签最多的
return labelList.index(max(labelList))
def model_test_accur(trainDataArr, trainLabelArr, testDataArr, testLabelArr, topK,testNum):
print('start test')
# 训练数据
trainDataMat = np.mat(trainDataArr)
trainLabelMat = np.mat(trainLabelArr).T
# 测试数据
testDataMat = np.mat(testDataArr)
testLabelMat = np.mat(testLabelArr).T
errorCnt = 0
for i in range(testNum):
print('test {0}:{1}'.format(i,testNum))
testX = testDataMat[i]
testy = getClosest(trainDataMat, trainLabelMat, testX, topK)
if testy != testLabelMat[i]: errorCnt += 1
#返回正确率
return 1 - (errorCnt / testNum)