【机器学习】

本文介绍了机器学习中的KNN(k近邻)算法,适合初学者。KNN算法通过计算新数据与已有数据的距离,选择最近的K个数据进行分类或回归。文章提供了举例说明,包括距离计算和投票分类,并展示了使用scikit-learn库实现KNN的步骤。注意,KNN算法没有模型,训练数据集本身就是模型。
摘要由CSDN通过智能技术生成

【机器学习】KNN —k近邻算法的学习

算法介绍

这个算法适合机器学习初学者的算法,基本没有任何的数学知识,在机器学习中有很好地效果,能够解释很多机器学习中的问题,更完整的刻画机器学习的算法应用,同样也有很多缺点。
在这里插入图片描述
​ 如图,当新的数据来到时,将数新的数据与原有数据进行比较,选取其最近的K 个原有数据来进行比较,通过比较的结果来判断该点的分类情况。该算法首先能解决的就是监督学习中的分类问题,当然回归问题也可得到解决。

举例

在这里的数据集是根据学习视频里编写的假的数据集,具体思路根据代码中的注释来观察。

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

raw_data_X = [  [3.393533211,2.331273381 ],
                [3.110073483,1.781539638],
                [1.343808831,3.368360954],
                [3.582294042,4.679179110],
                [2.280362439,2.866990263],
                [7.423436942,4.696522875],
                [5.745051997,3.533989803],
                [9.172168622,2.511101045],
                [7.792783481,3.424088941],
                [7.939820817,0.791637231] ]
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)#将xy传入训练集即可
#这是新来的数据
s = np.array([5.425516942,3.6456522875])
#初学者这里的横纵左边很难理解,上次的介绍中有这部分知识,可以当做参考。
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color="g")
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color="r")
plt.scatter(s[0],s[1],color="y")
plt.show()

KNN的过程

  1. 首先要计算距离(寻找最近的数据点)

在这里插入图片描述

这里的公式距离公式从很简单,只是两点距离公式,多个数据之间的距离。

  1. 这里生成表达式也可以用下列循环表示,具体语句自己多看看就会了。
distances = [sqrt(np.sum((x_train - s)**2)) for x_train in x_train]
# for x_train in x_train:
#     d = sqrt(np.sum((x_train - s)**2))
#     distances.append(d)
  1. 同时,表示出来距离数据点的横纵坐标。
#找到与数据点最近的点有哪些!使用np.argsort()将数组中的数进行排序,返回出具体数值的索引!
#print(np.argsort(distances))
#[6 3 5 8 0 1 4 9 7 2]返回的索引
nearest = np.argsort(distances)#把数组给这个变量
k = 6
topk_y = [y_train[i] for i in nearest[:k]]
#print(topk_y)[1, 0, 1, 1, 0, 0]这样可以观察一下得到点的纵坐标
  1. 投票比较选择出分类种类
#统计该坐标包含的元素,和出现的频率,可以将这个过程看成投票的过程!
votes = Counter(topk_y)
#取出最多的那个一数,但是返回的是一个列表,我们只需要他的数值,不需要他的个数所以去【0】,
predict_y = votes.most_common(1)[0][0]

代码整合!

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from math import sqrt
from collections import Counter

raw_data_X = [  [3.393533211,2.331273381 ],
                [3.110073483,1.781539638],
                [1.343808831,3.368360954],
                [3.582294042,4.679179110],
                [2.280362439,2.866990263],
                [7.423436942,4.696522875],
                [5.745051997,3.533989803],
                [9.172168622,2.511101045],
                [7.792783481,3.424088941],
                [7.939820817,0.791637231] ]
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)
s = np.array([5.425516942,3.6456522875])
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color="g")
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color="r")
plt.scatter(s[0],s[1],color="y")
plt.show()
distances = [sqrt(np.sum((x_train - s)**2)) for x_train in x_train]
# for x_train in x_train:
#     d = sqrt(np.sum((x_train - s)**2))
#     distances.append(d)
#print(distances)
#找到与数据点最近的点有哪些!使用np.argsort()将数组中的数进行排序,返回出具体数值的索引!
#print(np.argsort(distances))
#[6 3 5 8 0 1 4 9 7 2]返回的索引
nearest = np.argsort(distances)#把数组给这个变量
k = 6
topk_y = [y_train[i] for i in nearest[:k]]
#print(topk_y)[1, 0, 1, 1, 0, 0]这样可以观察一下得到点的纵坐标
#统计该坐标包含的元素,和出现的频率,可以将这个过程看成投票的过程!
votes = Counter(topk_y)
#取出最多的那个一数,但是返回的是一个列表,我们只需要他的数值,不需要他的个数所以去【0】,
predict_y = votes.most_common(1)[0][0]

通过具体的方法来理解机器学习中的KNN算法,这里的语句都很简单。同样算法的封装主要运用函数的方式

这里直接给展示一下分装之后加入的断言(就是判断数据中的数据时候输入正确!)

在这里插入图片描述

这里断言的目的就是防止用户使用算法的时候将数据传入错误而加的。

在算法中knn算法中我们并没有的到模型,knn算法是没有模型的算法,其实训练数据集本可以看做训练数据集的模型。同样每一个算法都会fit过程。

使用scikit—learn中的KNN

机器学习中的算法都是面向对象进行包装的。shi’yo

#加载对应的算法
from sklearn.neighbors import KNeighborsClassifier
#创建算法对应的实例
kNN_classifier = KNeighborsClassifier(n_neighbors=6)
#需要经行fit来拟合训练数据籍
kNN_classifier.fit(x_train,y_train)
S = s.reshape(1,-1)
P = kNN_classifier.predict(S)
print(P)

这是一个标准的过程,在以后的使用中都会是这样一个过程。

要经行fit来拟合训练数据籍
kNN_classifier.fit(x_train,y_train)
S = s.reshape(1,-1)
P = kNN_classifier.predict(S)
print§


这是一个标准的过程,在以后的使用中都会是这样一个过程。

这里我们也能自己把代码封装起来,但是作为初学者为了提高学习效率,就不写了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值