K近邻法

k近邻法:为新的输入在数据集中找到与该实例距离最短的k个实例,这k个实例的多数属于某个类,则把该实例归入到该类中(“多数表决”规则)

  1. 常用“欧式距离”度量实例间的距离
  2. 使用“交叉验证”的方法选取合适的k值
  3. 为了保证每个数值的同等重要性,对每个特征进行归一化

算法实现

#-*-coding:utf-8 -*-
import numpy as np
import math

#训练集和类别
def creatDataSet( ):
    group = np.array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
    label = ['A','A','B','B']
    return group,label

#确定输入实例以及k值
def inputData( ):
    test_data=np.array([ [1.1 , 0.3] ])
    K = 3
    return test_data,K

#归一化
def Normalization( group ):
    max = np.amax(group,axis=0)
    min = np.amin(group,axis=0)
    for i in range(len(group)):
        group[i][0] /= (max[ 0 ] - min[ 0 ])
        group[i][1] /= (max[ 1 ] - min[ 1 ])
    return group

#求输入实例与训练集中所有点的欧氏距离
def Distance( group ,dis ):
    test,K=inputData( )
    group = Normalization( group )
    for i in range(len(dis)):
        dis[i] = math.sqrt((group[i][0] - test[0][0]) ** 2 + (group[i][1] - test[0][1]) ** 2 )
    return dis,K,test

#找出输入实例的类别
def Classify_By_KNN( group , label ):
    size = len( label )
    dis = np.zeros( size )
    dis,k,test = Distance( group ,dis )
    sortedDistIndex=np.argsort(dis)
    countLabel={}
    for i in range(k):
        l=label[sortedDistIndex[i]]
        countLabel[l] = countLabel.get(l,0) + 1
    countMax=max(countLabel.values())
    for key,value in countLabel.items():
        if value == countMax:
            print("测试数据为:",test,"   分类结果为:",key)
    
g,l=creatDataSet( )
Classify_By_KNN( g , l )

运行结果:
在这里插入图片描述
参考文献:

  1. 《统计学习方法》李航

  2. 知乎:一文搞懂k近邻算法

https://zhuanlan.zhihu.com/p/25994179

https://zhuanlan.zhihu.com/p/26029567

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值