机器学习笔记6_KNN介绍与案例

KNN算法

1. 定义

k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法,是机器学习中原理最简单的算法。

2. 原理

给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最近的k个点来投票决定X归为哪一类

2.1数学原理:

欧拉距离:

( x ( a ) − x ( b ) ) 2 + ( y ( a ) − y ( b ) ) 2 \sqrt{(x^{(a)}-x^{(b)})^2+(y^{(a)}-y^{(b)})^2} (x(a)x(b))2+(y(a)y(b))2

当数据集的特征比较多,为n时:

( x ( a ) − x ( b ) ) 2 + ( y ( a ) − y ( b ) ) 2 + ( z ( a ) − z ( b ) ) 2 + ⋯ + ( N ( a ) − N ( b ) ) 2 \sqrt{(x^{(a)}-x^{(b)})^2 + (y^{(a)}-y^{(b)})^2 + (z^{(a)}-z^{(b)})^2 + \cdots + (N^{(a)}-N^{(b)})^2} (x(a)x(b))2+(y(a)y(b))2+(z(a)z(b))2++(N(a)N(b))2

3.例子

# 肿瘤预测案例
import numpy as np
import matplotlib.pyplot as plt

# row data 是python中普通的list
row_data_X = [[3.3935, 2.3312],
              [3.1101, 1.7815],
              [1.3438, 3.3684],
              [3.5823, 4.6792],
              [2.2804, 2.8670],
              [7.4234, 4.6965],
              [5.7451, 3.5340],
              [9.1722, 2.5111],
              [7.7928, 3.4241],
              [7.9398, 0.7916]]
# 0:良性肿瘤,1:恶性肿瘤
row_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
# 将数据变为np数据
X_train = np.array(row_data_X)
y_train = np.array(row_data_y)
x = np.array([8.0936, 3.3657])  # 给定待测点

# plot,将不同label的点区分开
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[0],x[1],color='g')
plt.show()


数据分布图

# 计算待测点与所有点的距离,并放到1个列表
from math import sqrt
distances = [sqrt(np.sum((x_train - x)**2)) for x_train in X_train ]
                  
# 找出距离最近的k个点,并知道它的label
k = 6
arg_nearests = np.argsort(distances)
top_K = [y_train[arg_nearest] for arg_nearest in arg_nearests[:k] ]
print("the nearest is: \n", top_K)
the nearest is: 
 [1, 1, 1, 1, 1, 0]
# 计算各个元素的数量
from collections import Counter
Counter(top_K)
Counter({1: 5, 0: 1})
votes = Counter(top_K)
votes.most_common(1)  # 求最多的值,1表示最多的1个
[(1, 5)]
votes.most_common(1)[0][0]  # 选这个列表的第0个,元组的第0个
1

最后判断改待测点最大可能是1


学习视频来源

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值