KNN算法,从0到1一次学会!(手写knn和内置库两种方式)

第一部分:手写knn算法

(1)导包

#方法1:手写knn算法
#第一步:导包
import numpy as np
import matplotlib.pyplot as plt

(2)设置数据集

#第二步:设置数据集
#2.1样本特征值
data_x=[
    [1.3,6],
    [3.5,5],
    [4.2,2],
    [5,3.3],
    [2,9],
    [5,7.5],
    [7.2,4],
    [8.1,8],
    [9,2.5]
]
#2.2样本的标记值
data_y=[0,0,0,0,1,1,1,1,1]
#2.3将上述两个数组转化为array形式(同时作为训练集)
X_train=np.array(data_x)
Y_train=np.array(data_y)

(3)绘制散点图

#第三步:绘制散点图
#3.1绘制样本为true的散点图
plt.scatter(X_train[Y_train==0,0],X_train[Y_train==0,1],color='red',marker='x',label="正确样本")
#3.2绘制样本为false的散点图
plt.scatter(X_train[Y_train==1,0],X_train[Y_train==1,1],color='blue',marker='o',label="错误样本")
plt.title('散点图绘制教程')
plt.xlabel('横坐标')
plt.ylabel('纵坐标')
from pylab import mpl
# 设置中文显示字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False

# 为不同类别指定不同的颜色
colors = {'正确样本': 'red', '错误样本': 'blue'}
plt.legend()
plt.show()

(4)knn手写预测新点

#第四步:现在给你一个新点,如何判断它应该画成什么颜色呢
#4.1新的样本点以及它在图中的位置
data_new=np.array([4,5])
plt.scatter(data_new[0],data_new[1],color='black',marker='^')
#4.2计算新样本点与原有样本点之间的距离
'''
for data in X_train:
    print(np.sqrt(np.sum((data-data_new)**2)))
'''
#用简化版
result_distance=[np.sqrt(np.sum((data-data_new)**2))for data in X_train]
#接着我们需要按照距离的远近进行排序
sort_index=np.argsort(result_distance)#得到的将会是从小到大排序后的索引下标值
#4.3选择k值
k=5
k_data=[Y_train[i] for i in sort_index[0:k]]#将前k个数据的标签值获取到,得到[0, 0, 1, 0, 0]
#4.4计算各类别投票个数
from collections import Counter
Counter(k_data)#得到Counter({0: 4, 1: 1})属于字典形式,表示0标签有4个,1标签有1个
Counter(k_data).most_common()#得到[(0, 4), (1, 1)],变成元组形式
Counter(k_data).most_common(1)#得到[(0, 4)],代表选出投票最多的那个元组
final_result=Counter(k_data).most_common(1)[0][0]#得到0,也就是得到第一行数据的第一个值,也就是标签值
print(final_result)

输出结果为0,代表预测结果为0类别。

(5)完整的pycharm代码汇总

#第一步:导包
import numpy as np
import matplotlib.pyplot as plt
#第二步:设置数据集
#2.1样本特征值
data_x=[
    [1.3,6],
    [3.5,5],
    [4.2,2],
    [5,3.3],
    [2,9],
    [5,7.5],
    [7.2,4],
    [8.1,8],
    [9,2.5]
]
#2.2样本的标记值
data_y=[0,0,0,0,1,1,1,1,1]
#2.3将上述两个数组转化为array形式(同时作为训练集)
X_train=np.array(data_x)
Y_train=np.array(data_y)

#第三步:绘制散点图
#3.1绘制样本为true的散点图
plt.scatter(X_train[Y_train==0,0],X_train[Y_train==0,1],color='red',marker='x',label="正确样本")
#3.2绘制样本为false的散点图
plt.scatter(X_train[Y_train==1,0],X_train[Y_train==1,1],color='blue',marker='o',label="错误样本")
plt.title('散点图绘制教程')
plt.xlabel('横坐标')
plt.ylabel('纵坐标')
from pylab import mpl
# 设置中文显示字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False

# 为不同类别指定不同的颜色
colors = {'正确样本': 'red', '错误样本': 'blue'}
plt.legend()
plt.show()

第二部分:使用内置库完成knn算法

(1)导包

#方法2:不用手动计算knn,我们直接进行导入库的操作
#第一步:导包
import numpy as np
from sklearn.neighbors import KNeighborsClassifier

(2)新建knn对象并设置k值

#第二步:创建knn对象并设置k值
knn_classifer=KNeighborsClassifier(n_neighbors=5)

(3)调用fit方法训练

#第三步:调用fit进行训练
#3.1样本特征值
data_x=[
    [1.3,6],
    [3.5,5],
    [4.2,2],
    [5,3.3],
    [2,9],
    [5,7.5],
    [7.2,4],
    [8.1,8],
    [9,2.5]
]
#3.2样本的标记值
data_y=[0,0,0,0,1,1,1,1,1]
#3.3将上述两个数组转化为array形式(同时作为训练集)
X_train=np.array(data_x)
Y_train=np.array(data_y)
#3.4调用fit进行训练
knn_classifer.fit(X_train,Y_train)

(4)使用knn进行预测

#第四步:开始预测
#4.1新的样本点
data_new=np.array([4,5])
#由于我们这个预测需要用到的是矩阵的形式,所以我们需要将这个一维数据转换为二维数据
data_new.reshape(1,-1)#array([[4, 5]])
#4.2开始预测
knn_classifer.predict(data_new.reshape(1,-1))#输出值为预测结果array([0])
final_result=knn_classifer.predict(data_new.reshape(1,-1))[0]
print(final_result)

(5)以上代码的完整pycharm版本

#方法2:不用手动计算knn,我们直接进行导入库的操作
#第一步:导包
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
#第二步:创建knn对象并设置k值
knn_classifer=KNeighborsClassifier(n_neighbors=5)
#第三步:调用fit进行训练
#3.1样本特征值
data_x=[
    [1.3,6],
    [3.5,5],
    [4.2,2],
    [5,3.3],
    [2,9],
    [5,7.5],
    [7.2,4],
    [8.1,8],
    [9,2.5]
]
#3.2样本的标记值
data_y=[0,0,0,0,1,1,1,1,1]
#3.3将上述两个数组转化为array形式(同时作为训练集)
X_train=np.array(data_x)
Y_train=np.array(data_y)
#3.4调用fit进行训练
knn_classifer.fit(X_train,Y_train)

#第四步:开始预测
#4.1新的样本点
data_new=np.array([4,5])
#由于我们这个预测需要用到的是矩阵的形式,所以我们需要将这个一维数据转换为二维数据
data_new.reshape(1,-1)#array([[4, 5]])
#4.2开始预测
knn_classifer.predict(data_new.reshape(1,-1))#输出值为预测结果array([0])
final_result=knn_classifer.predict(data_new.reshape(1,-1))[0]
print(final_result)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值