3.K最近邻算法—(k-Nearest Neighbor,简称KNN)

一、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)

猜你喜欢

转载自blog.csdn.net/weixin_41044112/article/details/108206669