栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

KNN---k近邻算法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

KNN---k近邻算法

目录

代码实现

训练集准备

可视化操作

 测试集

结果猜想 

KNN算法实现

求距离 

 对距离x的测试集点排序

求最近k个点所属类别 

计算投票数

 把KNN过程集合到一个py文件KNN.py


这里是一个分类问题----思想很简单
对要预测的数据与测试集的各个点求距离,然后取出距离最近k个点,采取投票制,即k个点中那个类别的数量最多,就预测为哪类

代码实现

训练集准备
import numpy as np

x=[[1.2,5.6],
   [3.4,8.2],
   [2.6,9.1],
   [1.8,7.2],
   [4.1,7.8],
   [7.5,2.5],
   [9.1,4.5],
   [3.8,5.4],
   [7.7,1.4],
   [5.5,6.6]
  ]
y=[0,0,0,1,1,1,1,2,2,2]

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

这里假设:训练集x有10个样本,每个样本有2个属性;测试集y有3类,即:0,1,2

注意:训练集x的行数,要与测试集y的元素个数一致

可视化操作
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color="r")
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color="b")
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color="g")

 

x_train[y_train==0,0]

这里的意思是:
取x_train中y_train==0的那些行,由于y_train是一维的,所以用true和false过滤

然后取x_train的第0列,即第一个属性

 绘图是选取不同类别中x_train的第1个属性为横坐标,第2个属性为纵坐标

 测试集
x=[4.3,6.2]

结果猜想 

 很明显---如果k=4,距离x(黄)最近的且类别最多的为绿色,即2

KNN算法实现

首先求距离最近的k个点,主要关注的不是距离值,而是距离对应的点的位置

求距离 
from math import sqrt
distance=[ ]
for i in x_train:
    m=sqrt(np.sum((x-i)**2))
    distance.append(m)

 当然也可以使用Python的lammda表达式,而且更高效

 对距离x的测试集点排序

 使用了argsort,因为我们关注的不是dist的排序,而是点

求最近k个点所属类别 

 

 如图:从nearest的前k个点取出对应y即类别

计算投票数

 

 采用了集合类中的Counte用法,a:b,a是集合元素,b是出现个数

 

注意most_common(k)是取集合的前k个元素 

 ()得到元组,第一个[0]取得是第一个元素,第二个【0】是我们关注的类别

 把KNN过程集合到一个py文件KNN.py
import numpy as np
from math import sqrt
from collections import Counter
def kNN_classify(k,x_train,y_train,x):
    #输入合法性检查
    assert 1<=k<=x_train.shape[0],"k must valid"
    assert x_train.shape[0]==y_train.shape[0],"label and attribute"
    assert x_train.shape[1]==x.shape[0],
        "x attribute--1d==x_train attribute--2d"
    #knn算法
    dist=[sqrt(np.sum((x-i)**2)) for i in x_train]
    nearest=np.argsort(dist)
    tok_y=[y_train[i] for i in nearest[:k]]
    votes=Counter(tok_y)
    return votes.most_common(1)[0][0]


使用魔法命令

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938784.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号