KNN算法 使用KNN对iris数据集分类

一、KNN算法 (K近邻算法) 简述

可以简单粗暴的认为在判断一个未知事物时,可以观察离它最近的几个样本。

步骤:

寻找样本数据集K个最近的元素

计算K个元素中各种类别的占比

占比最高的类别即为新数据的类别

K的取值对结果有很大的影响

如下图,中间的圆要被赋予哪个类?是三角形还是正方形?如果K=3,由于三角形所占比例为2/3,圆将被赋予三角形那个类;如果K=7,由于正方形所占比例为4/7,圆将被赋予正方形那个类

计算复杂度优化

  • 计算新数据(未知样本)和K个训练样本的距离dist;
  • 得到目前K个最邻近样本中的最大距离maxdist;
  • 如果第K+1个训练样本......(剩余的所有训练样本)的dist小于maxdist,则将该训练样本作为K-最近邻样本(即替换掉上述K个最邻近样本中最大距离的那个训练样本)。

边界清晰--选取中心点 纯度 

数据倾斜问题-- 增加权重

二、使用KNN对iris数据集分类

1、导入numpy、Matplotlib、sklearn类库及其模块

import numpy as np
# Puplot 提供了一套和MATLAB类似的绘图API,使得Matplotlib的机制更像MATLAB。
# 我们只需要调用Pyplot模块所提供的函数就可以快速绘图并设置图表的各个细节
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap 
from sklearn.neighbors import KNeighborsClassifier # 导入sklearn类库及KNN模型
from sklearn.datasets import load_iris

 2、加载鸢尾花数据集

# 加载鸢尾花数据集,并分割成样本特征X和样本标签Y
iris = load_iris()
X = iris.data[:,:2]
# print(X)
# print(X[:,0])
Y = iris.target

3、设置绘图背景色和散点颜色映射表

# 绘制背景颜色和散点颜色映射表
cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF'])

4、 构建KNN模型

clf = KNeighborsClassifier(n_neighbors= 10,weights='uniform')

5、 调用模型的fit函数进行训练

clf.fit(X,Y)

6、画出决策边界

# 画出决策边界
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,0.02),np.arange(y_min,y_max,0.02))

Z = clf.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)

plt.figure()
plt.pcolormesh(xx,yy,Z,cmap=cmap_light)

 7、绘制预测结果图

# 绘制预测结果图
plt.scatter(X[:,0],X[:,1],c = Y,cmap=cmap_bold)
plt.xlim(xx.min(),xx.max()) # xlim:当前图形X轴的范围
plt.ylim(yy.min(),yy.max())
plt.title('3_Class(k=10,weights=uniform)')
plt.show

 8、结果展示

部分解释

1、numpy.meshgrid()

(参考https://www.cnblogs.com/black-mamba/p/9186965.html)

x = np.array([0, 0.5, 1])
print('x: ',x)
print('--------------')
y = np.array([0,1])
xv,yv = np.meshgrid(x, y) # numpy.meshgrid(x轴上的坐标向量, y轴上的坐标向量)
print('xv: \n',xv)
print('--------------')
print('y: ',y)
print('--------------')
print('yv: \n',yv)
print("xv的维度:{},shape:{}".format(xv.ndim, xv.shape))
print("yv的维度:{},shape:{}".format(yv.ndim, yv.shape))

plt.plot(xv, yv, 'o--')
plt.grid(True)
plt.show()

 

# 此处为了好观看结果,将步长设置为1
print((np.arange(x_min,x_max,1)))

 

print((np.arange(y_min,y_max,1)))

 

 

2、numpy.c_ 

# numpy.c_ 将一维数组作为列堆叠到二维数组中。
arr = np.c_[np.array([1,2,3]), np.array([4,5,6])]
print(arr)

 

3、ravel()

ravel()方法将数组维度拉成一维数组

print((np.c_[xx.ravel(),yy.ravel()])) 

代码:

import numpy as np
# Puplot 提供了一套和MATLAB类似的绘图API,使得Matplotlib的机制更像MATLAB。
# 我们只需要调用Pyplot模块所提供的函数就可以快速绘图并设置图表的各个细节
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap 
from sklearn.neighbors import KNeighborsClassifier # 导入sklearn类库及KNN模型
from sklearn.datasets import load_iris

# 加载鸢尾花数据集,并分割成样本特征X和样本标签Y
iris = load_iris()
X = iris.data[:,:2]
# print(X)
# print(X[:,0])
Y = iris.target

# 绘制背景颜色和散点颜色映射表
cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF'])

clf = KNeighborsClassifier(n_neighbors= 10,weights='uniform')
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,0.02),np.arange(y_min,y_max,0.02))

Z = clf.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)

plt.figure()
plt.pcolormesh(xx,yy,Z,cmap=cmap_light)
# 这两部分代码一块执行

# 绘制预测结果图
plt.scatter(X[:,0],X[:,1],c = Y,cmap=cmap_bold)
plt.xlim(xx.min(),xx.max()) # xlim:当前图形X轴的范围
plt.ylim(yy.min(),yy.max())
plt.title('3_Class(k=10,weights=uniform)')
plt.show

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值