K近邻算法

KNN:K-NearestNeighbor–K最近邻(原理)

K最近邻,就是k个最近的邻居的意思,即:每个样本都可以用他最近的k个邻居来代表。
核心思想:如果一个样本在特征空间中的K个最相邻的样本,并且最相邻样本中的大多数属于某一个类别(该样本也属于这个类别,并具有该类别上样本的特性)
KNN很大程度上取决于K的选择

算法三要素:

k值的选择
距离度量方式--------百度上很多
分类决策规制

 

距离度量:

欧氏距离():
曼哈顿距离(城市街区距离):

k值选择:

较小k值:相当于较小的领域中训练实例,训练误差减小,容易过拟合;
较大k值:较大领域训练实例进行预测,有点减少泛化误差,缺点训练误差增加。

分类决策规则:

分类:
多数表决法
回归:
平均值

如何实现KNN

补充知识:python中对字典进行排序

import operator
def SortDict():
    dic={'a':1,'b':2,'c':3,'f':0}
    #函数原型:sorted(dic,value,reverse)
    #按字典中的键进行升序排序
    print("按字典中的键进行升序排序:",\
    sorted(dic.items(),key=operator.itemgetter(0),reverse=False))
    #按字典中的键进行降序排序
    print("按字典中的键进行降序排序:",\
    sorted(dic.items(),key=operator.itemgetter(0),reverse=True))
    #按字典中的值进行升序排序
    print("按字典中的值进行升序排序:",\
    sorted(dic.items(),key=operator.itemgetter(1),reverse=False))
    #按字典中的值进行降序排序
    print("按字典中的值进行降序排序:",\
    sorted(dic.items(),key=operator.itemgetter(1),reverse=True))

SortDict()
································································
输出结果:
按字典中的键进行升序排序: [('a', 1), ('b', 2), ('c', 3), ('f', 0)]
按字典中的键进行降序排序: [('f', 0), ('c', 3), ('b', 2), ('a', 1)]
按字典中的值进行升序排序: [('f', 0), ('a', 1), ('b', 2), ('c', 3)]
按字典中的值进行降序排序: [('c', 3), ('b', 2), ('a', 1), ('f', 0)]

简单的knn实现的代码:

#-coding:utf-8--
"""
自定义实现KNN算法
给定一组数据集:其包括了(x,y)
给定一个预测的样本,
通过KNN来预测样本属于哪分类
样本集:
1,1,A
1,2,A
1.5,1.5,A
3,4,B
4,4,B
测试数据:
2,2
请通过KNN对该数据进行分类预测
算法实现思路:
1,计算预测样本和数据集中样本点距离
2,将所有距离从小到大排序
3,计算前K个最短距离类别的个数
4,返回前K个最小距离中个数最多的的分类
"""
import numpy as np 
import operator
def handle_data(dataset):
    """
    dataset:样本集
    return:输出x和y
    """
    x=dataset[:,:-1].astype(float)
    y=dataset[:,-1]
    return x,y

def knn_classifier(k,dataset,input):
    """
    k:k个邻居
    dataset:所有数据集
    input:测试数据
    return:输出预测类别
    """
    x,y=handle_data(dataset)
    #1,计算预测样本和数据集样本的距离
    dist=np.sum((input-x)**2,axis=1)**0.5   #axis=1表示一维
    #2,将所有距离从小到大排序
    sortedDist=np.argsort(dist) #argsort 排序之后输出下标
    #3,计算前K个最短距离类别的个数
    countLable={}
    for i in range(k):
        label=y[sortedDist[i]]
        countLable[label]=countLable.get(label,0)+1
    #4,返回前K个最小距离中个数最多的的分类(python中字典的排序)


    sortedLabel=sorted(countLable.items(),key=operator.itemgetter(1),reverse=True)
    return sortedLabel[0][0]

if __name__ == "__main__":
    dataset = np.loadtxt("C:/Users/yanruyu/Documents/code/python/GA/dataset.txt",dtype="str",encoding='utf-8',delimiter=',')  #默认为float,需要dtype
    x=dataset[:,:-1].astype(np.float)     
    y=dataset[:,-1]    
    test=[2,2]  #预测数据
    print(knn_classifier(3,dataset,test))
···························································
输出结果:
PS C:\Users\yanruyu> & D:/Anaconda3/python.exe c:/Users/yanruyu/Documents/code/python/GA/text.py
 A

 

posted @ 2021-05-18 16:31  北极星!  阅读(143)  评论(0编辑  收藏  举报