【数学建模学习】KNN板子+算法原理讲解和算法图留坑

看到一篇写的很好的博客,但是没找到之前看的那篇博客,放不了链接了orz(代码也是参考那篇博客)

KNN板子说明:

这里只提供二维数据的KNN板子,本来想找三维数据的,但网上查了好久也没有。如果遇到高维数据了还是要主成分分析降维。

先明确他要干什么:给你一个训练集(包括数据和分类),给你一些测试用例,然后判断这些测试用例属于哪一类。

板子如何使用:X,Y为训练集的数据,X为二维的数据,是一个n行2列的矩阵,Xi,j表示第i个样本的第j维的数据;Y为一个具有n个元素的数组,Yi表示第i个样本的类别。

# X为列数为2,行数为n的数据(二维数据)
# Y表示训练集提供的每个数据的类别(0,1,2,3,4:表示五类数据)
像这样(数目不对应,只供数据格式参考)
X
[[-4.43344765e+00 -9.14511574e+00]
 [-5.06998128e+00 -9.75464122e+00]
 [ 6.54464509e+00  8.99873511e-01]
 [ 3.25023324e-01  1.50633915e-01]
 [-1.51028157e+00 -1.10581275e+00]
 [-8.90489310e+00 -1.10427432e+01]
 [ 9.28383472e-02 -2.00771121e-02]
 [-6.21720086e+00 -1.11227678e+01]
 [ 7.63027116e+00  8.69797933e+00]
 [ 7.92430026e+00  1.04511206e-01]
 [-7.13921438e+00 -1.07768258e+01]
 [ 7.94310647e+00  8.20622208e+00]
 [-5.66941096e+00 -7.88820528e+00]
 [ 5.28435774e+00  1.01697239e+01]
 [ 5.07337492e+00  1.05248297e+01]
 [-4.00121727e+00 -9.63422163e+00]
 [-2.30506902e-01 -6.02317146e-02]
 [ 7.31294296e+00  9.92166331e+00]
 [-5.46321188e+00 -9.30519694e+00]
 [-1.27991474e+00 -2.55655518e+00]
 [ 7.44636985e+00  1.14367495e+01]
 [-8.27628229e-01 -1.07833492e+00]
 [ 8.67425268e+00 -3.78602737e-01]
 [-1.32692658e+00 -1.44628313e+00]
 [-3.48914851e-01  8.18190422e-01]
 [ 6.56880050e+00  9.52289784e-02]]
 Y
 [2 2 0 1 2 4 3 0 2 3 0 2 0 4 4 1 0 0 4 1 1 1 4 3 0 1 2 1 1 0 3 3 2 2 1 4 3
 4 4 2 0 1 4 3 0 3 0 2 3 2 1 4 0 1 3 2 2 3 2 1 2 1 1 4 4 1 3 4 2 4 4 0 1 3
 0 1 1 2 1 3 4 0 2 2 3 1 4 2 3 1 1 4 0 3 4 0 2 3 2 0 1 1 3 3 0 2 2 1 2 0 0
 2 4 0 1 2 2 1 0 4 3 1 1 2 2 1 1 2 1 0 0 3 2 2 4 4 2 2 3 1 0 4 0 4 3 3 0 3
 1 0 1 4 4 4 1 3 0 2 2 4 0 3 2 2 1 4 4 4 0 4 3 2 4 3 3 1 3 0 0 2 0 0 3 3 2
 2 3 1 4 0 4 3 2 4 0 3 3 3 0 0 4 3 1 1 4 3 3 3 2 2 1 4 2 4 0 1 0 4 4 0 4 4
 3 3 4 2 4 1 4 0 1 0 1 4 4 4 1 2 1 1 3]

分类的类别数:(此处为5)

clf = KNeighborsClassifier(n_neighbors=5)

然后就是测试数据,测试样本只需给两个值(二维数据),在这里修改(此处测试样本为0,5)

# 把待分类的数据点用五星表示出来
plt.scatter(0,5,marker='*',c='red',s=200)
 
# 对待分类的数据点的分类进行判断
res = clf.predict([[0,5]])

完整板子:

# 导入画图工具
import matplotlib.pyplot as plt
# 导入数组工具
import numpy as np
# 导入数据集生成器
from sklearn.datasets import make_blobs
# 导入KNN 分类器
from sklearn.neighbors import KNeighborsClassifier
# 导入数据集拆分工具
from sklearn.model_selection import train_test_split
 
# 生成样本数为500,分类数为5的数据集
data=make_blobs(n_samples=500, n_features=2,centers=5, cluster_std=1.0, random_state=8)
X,Y=data
# X为列数为2,行数为n的数据(二维数据)
# Y表示训练集提供的每个数据的类别(0,1,2,3,4:表示五类数据)
print("X")
print(X)
print("Y")
print(Y)
 
# 将生成的数据集进行可视化
# plt.scatter(X[:,0], X[:,1],s=80, c=Y,  cmap=plt.cm.spring, edgecolors='k')
# plt.show()
 
clf = KNeighborsClassifier(n_neighbors=5)
clf.fit(X,Y)
 
# 绘制图形
x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
xx,yy=np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
z=clf.predict(np.c_[xx.ravel(),yy.ravel()])
 
z=z.reshape(xx.shape)
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Pastel1)
plt.scatter(X[:,0], X[:,1],s=80, c=Y,  cmap=plt.cm.spring, edgecolors='k')
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:KNN")
 
# 把待分类的数据点用五星表示出来
plt.scatter(1,2,marker='*',c='red',s=200)
 
# 对待分类的数据点的分类进行判断
res = clf.predict([[1,2]])
plt.text(0.2,4.6,'Classification flag: '+str(res))
plt.text(3.75,-13,'Model accuracy: {:.2f}'.format(clf.score(X, Y)))
 
plt.show()

KNN算法流程图:

有时间补orz

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值