【机器学习】KNN算法

  1. 概述

KNN(K-Nearest Neighbors),又称K-近邻算法。
简单来讲,K-近邻算法采用不同特征值之间的距离方法进行分类。

在这里插入图片描述
2. 前提准备

https://www.runoob.com/numpy/numpy-matplotlib.html

  1. 手动算法实践
    导包:
import numpy as np
import matplotlib.pyplot as plt

模拟数据集:

train_data = np.array([np.random.random() * 10 for i in range(20)]).reshape((10,2))

在这里插入图片描述
创建训练集对应的标签(历史样本都包含特征和标签):

train_label = np.array([0,0,0,0,0,1,1,1,1,1])

绘制历史样本的分布:

plt.scatter(train_data[train_label == 0, 0], train_data[train_label == 0, 1], c='r')
plt.scatter(train_data[train_label == 1, 0], train_data[train_label == 1, 1], c='g')
plt.show()

在这里插入图片描述
预测样本在历史样本中的分布:

 predict_sample = np.array([np.random.random() * 10, np.random.random()
 * 10])

画出分布图:

plt.scatter(train_data[train_label == 0, 0], train_data[train_label == 0, 1], c='r')
plt.scatter(train_data[train_label == 1, 0], train_data[train_label == 1, 1], c='g')
plt.scatter(predict_sample[0], predict_sample[1], c='b')
plt.show()

在这里插入图片描述
计算预测样本与每一个历史样本的距离:

distances = []
for data in  train_data:
    # (x1 - x2)^2 + (y - y2)^2 开根号,算距离
    distance = np.sqrt(np.sum((predict_sample - data) ** 2))
    # 将计算出的距离添加到distances集合中
    distances.append(distance)
distances = np.array(distances)

取距离预测样本最近的前k个样本对应的标签,假设k=5:

k = 5
# .argsort返回的是一个数组(数组中存储的是数据从小到大的坐标)然后用切片的方式取出数组
predict_label = [train_label[i] for i in distances.argsort()[:k]]

得出结果:

from collections import Counter
# .most_common,取出集合中最多的次数的
Counter(predict_label).most_common(1)[0][0]

在这里插入图片描述
4. Sklearn_KNN
在这里插入图片描述
5. Sklearn_KNN2
在这里插入图片描述
续:
在这里插入图片描述
补充:

https://blog.csdn.net/weixin_41445387/article/details/96024886

本文使用的软件的名字及版本: Anaconda3-2019.07-Windows-x86_64

not learn to live:

有一次 国王为美丽的公主开宴会
有个士兵在一旁站岗
看到公主经过他的面前
她是绝色佳人 他立刻爱上了她
但卑微的士兵
怎配得上国王的女儿?
有一天 他终于设法接近她
并告诉她 没有她活不下去
公主被他的深情所感动 她告诉士兵
“如果你能等我100天 且日日夜夜在阳台下等我 百日之后我就是你的”
听了这话 士兵在阳台下等
一天 两天 十天 二十天
公主每晚往外探 他仍伫立终宵
风雪雨都抵挡不了他
鸟停在头上 蜜蜂叮他 他都不动
但是······在第九十天时
士兵全身已······苍白且瘦削
眼泪从眼眶里面流出来
他已撑不住了
甚至连睡觉的力气都没有
公主一直注视着他
最后 在第九十九天的晚上
士兵站了起来
提起椅子 走了! 走了!
前面的九十九天是爱的表现,最后一天是为了尊严。爱,是双方一起付出的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值