lzykevin
5/3/2020 - 4:19 AM

实现KNN最近邻算法

# 实现KNN最近邻算法
# 2019-6-11
# by llllzy

import os
os.getcwd()
os.chdir('E:\\python')

# 加载包
import numpy as np
import math
import operator

# 读取数据集
import kNN # 放在同一目录,注意大小写
group,labels = kNN.createDataSet()

# K-近邻算法(对一个向量进行分类的函数)
def kNNClassifier(inX, data, labels, k):
    # 获取数据集行数
    dataSize = data.shape[0]
    dist = np.empty(dataSize)
    classCount = {} # 初始字典格式

    # 计算已知类别数据集中的每个点和当前点之间的距离
    for i in range(dataSize):
        dist[i] = np.sqrt(np.sum(np.square(inX-data[i]))) # 等价于np.linalg.norm(inX-data[i]) 此处用的是欧氏距离

    # 将距离从小到大排序,标出排序的索引
    SortedIndexs = dist.argsort()

    # 选取与当前点距离最小的k个点
    for j in range(k):
        labels_topk = labels[SortedIndexs[j]]  # 获取前k个距离最小的点的labels
        classCount[labels_topk] = classCount.get(labels_topk, 0) + 1 # .get(labels_topk, 0) 若labels_topk 不存在,则在字典中生成该元素,并使其对应数字为0


    # 确定前k个点所在类别的出现频率
    Sorted_classCount = sorted(classCount, reverse=True) # 对标签按频次从大到小排序
    result = Sorted_classCount[0][0] # 获取字典中排在第一的值
    return result

kNNClassifier([0,0], group, labels, 3) # test