KNN算法及python实现

部署运行你感兴趣的模型镜像

分类算法 – KNN算法

KNN(K-Nearest Neighbor)是一个分类算法,属于有监督学习。

KNN思想的核心在于:近朱者赤,近墨者黑,根据新样本的k个最近邻居来判定其类别。

1. 理论说明

1.1 算法概论

假设我们已知n个样本的特征和标签(即所属分类),并以此作为样本集A。

当输入一个没有标签的样本b时,我们可以通过比较新样本b与样本集A中的数据对应的特征,然后提取出最为相似的k个数据。

最后我们选取k个最相似的数据中出现次数最多的分类,作为新数据的分类。

1.2 算法步骤

  • Step 1:计算已知类别的样本集A中的所有样本与新样本b之间的距离
  • Step 2:按照距离的递增次序,对样本集A中的样本进行排序
  • Step 3:选取与当前样本b距离最近的k个样本
  • Step 4:确定这k个样本所在类别的出现频率
  • Step 5:返回这k个样本中出现频率最高的类别作为当前样本b的预测分类

1.3 算法优劣

优势:精度高、对异常值不敏感、算法思想简单、比较适合多分类问题

劣势:计算成本高,中间步骤的储存成本高,对大规模数据不是很友好

1.4 详细问题

①k的选择

和聚类分析中的K-means算法相同,k的选择也是KNN方法的难点所在。

若k很小,结果容易受到噪声和极端值的影响;若k很大,则在选取的近邻中又包含很多无关的点,增加计算量的同时也影响计算结果。

根据经验,我们一般会让k小于样本集A中样本数量的平方根

②距离的度量

在算法中,我们明确说明了要计算已知类别的样本集A中的所有样本与新样本b之间的距离。那我们需要选择哪种距离呢?

当样本特征的单位相同、方差差距不大时,此时选择欧式距离是合理的;

当样本特征的单位不同,并且方差差距较大时,选择欧式距离会更加关注方差大的特征而忽视方差较小的特征,所以此时选取马氏距离效果较好。

 

python实现:

import numpy as np
from collections import Counter
from math import sqrt


def knn(x_train, y_train, x, k):
    distace = [sqrt(np.sum((train_data - x)**2)) for train_data in x_train]
    neast = np.argsort(distace)[:k]

    label = [y_train[i] for i in neast]
    votes = Counter(label)
    print("votes: {}".format(votes))
    predict = votes.most_common(1)[0][0]
    return predict

x = [[0,0],
     [1,1],
     [2,2],
     [10,10],
     [11,11],
     [12,12]]
y = [0,0,0,1,1,2]

X_train = np.array(x)
y_train = np.array(y)


x = np.array([13,13])
predict = knn(X_train,y_train,x, 3)
print(predict)

参考:https://blog.youkuaiyun.com/weixin_43216017/article/details/86679334

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值