K-近邻算法(KNN)

首先引入监督学习和无监督学习的概念:

监督学习:从已知类别的数据集中学习一个函数,这个函数可以对新的数据集进行预测分类;数据集包括:特征值目标值;

无监督学习:数据集没有人为标注的目标值,即没有标准答案。

KNN算法的原理:已知样本点的特征值和目标值,当新进来一个样本时,将此样本与最近的k个样本进行比较,这k个样本中,哪一个类别的个数最多,我们将其归为此类。

举个栗子:

现在有5个日本男生和5个韩国男生,然后第十一个男生的国籍是未知的,我们叫他为 Tony ,需要你来判断他是来自韩国还是日本的。 经过我们对头发,身份,五官等特征的比对,发现跟 Tony 比较像的5个人里,有4个是韩国人,1个是日本人,那我们是不是可以说,Tony是韩国人的概率大一点,从而初步判定他是韩国人。

算法步骤:

1.计算测试对象与所有样本的距离(常用欧氏距离);

2.找出上步中里测试对象距离最近的k个样本。

3.确定k个样本中某一类别出现频率最高的类别。(投票思想)。

上述第二步中采用欧式距离计算:

其中x^{(a)}表示样本a的x坐标(即点a的第一个特征值),x^{(b)}表示样本b的x坐标(即点b的第一个特征值),y^{(a)}表示样本a的y坐标(即点a的第二个特征值),y^{(b)}表示样本b的y坐标(即点b的第二个特征值)

python实现:

import numpy as np
import matplotlib.pyplot as plt
from math import sqrt

#参见博客https://flashgene.com/archives/85098.html

# 其中raw_data_x为样本点,两列分别为样本的两个特征值raw_data_y则对应raw_data_x的每个样本的类别
raw_data_x = [[3.39,2.33],
[3.11,1.78],
[1.34,3.36],
[3.58,4.67],
[2.28,2.86],
[7.42,4.69],
[5.74,3.53],
[9.17,2.51],
[7.79,3.42],
[7.93,0.79]
]
raw_data_y=[0,0,0,0,0,1,1,1,1,1]
#转为向量
X_train=np.array(raw_data_x)
Y_train=np.array(raw_data_y)
x=np.array([8.09,3.36])
plt.scatter(X_train[Y_train==0,0],X_train[Y_train==0,1],color='g')#类别Y为0的第一类特征向量,类别Y为0的第二类特征向量
plt.scatter(X_train[Y_train==1,0],X_train[Y_train==1,1],color='r')
plt.scatter(x[0],x[1],color='b')
plt.show()

#存放距离的数组
distances=[]
#遍历样本数组,计算预测点与每个样本点之间的距离
for x_train in X_train:
    #各特征值距离差的平方相加后开方
    d=sqrt(np.sum((x_train-x)**2))
    distances.append(d)
# print(distances)
#使用numpy的排序函数距离数组进行排序
nearset=np.argsort(distances)
print(nearset)#存放的是排序后的下标

k=6
#获取y_train数组对应下标的元素来得到这些样本点的类别
topK_y=[Y_train[i] for i in nearset[:k]]

from collections import Counter
#分类统计
votes=Counter(topK_y)

#获取个数最多的那个类别,也就是去第一个对象的第一个元素
predict_y=votes.most_common(1)[0][0]

结果说明:

绿色的点表示类别1,红色的点表示类别2,判断蓝色的点属于哪一个类。

参考博客:https://flashgene.com/archives/85098.html

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值