完整代码见 sklearn代码3 4-KNN-iris分类
依旧使用鸢尾花实例来进行操作
import numpy as np
import matplotlib.pylab as pyb
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
X,y = datasets.load_iris(True)
# 4个属性 需要4维空间才可以 4维数据
# 150代表样本数量
X.shape
(150, 4)

pyb.scatter(X[:,0],X[:,1],c = y) # 横坐标0,纵坐标1 y会分配颜色 red,green 等就是改变点的颜色

# 降维,最简单的降维操作就是切片 切片:简单粗暴的方式 信息量变少
X = X[:,2:] #切片从2开始一直到最后
X.shape
可以观察到前来前两个和后两个生成图像有很大的不同 
进行训练,可以看到结果,可训练成功
knn = KNeighborsClassifier(n_neighbors=5)
# 使用150个样本点作为训练数据
knn.fit(X,y)

# 获取测试数据
# 横坐标宽度 4~8 纵坐标2~4.5
# 背景点 取出来 meshgrid x1 = np.linspace(4,8,100) # 横坐标4~8,取一百个间隔
y1 = np.linspace(2,4.5,80)
X1,Y1 = np.meshgrid(x1,y1) display(X1.shape,Y1.shape)

# 训练数据
X.shape
# 测试数据 shape(?,2)
# 获取测试数据
# 横坐标宽度 4~8 纵坐标2~4.5
# 背景点 取出来 meshgrid
x1 = np.linspace(4,8,100) # 横坐标4~8,取一百个间隔
y1 = np.linspace(2,4.5,80)
X1,Y1 = np.meshgrid(x1,y1)
display(X1.shape,Y1.shape)
X1 = X1.reshape(-1,1) #-1代表8000样本,1代表横坐标长度
X1.shape
Y1 = Y1.reshape(-1,1)
X_test = np.concatenate([X1,Y1],axis = 1) # 对数据进行级联,将数据是组成训练样本的形式
X_test.shape

# 获取测试数据
# 横坐标宽度 4~8 纵坐标2~4.5
# 背景点 取出来 meshgrid
x1 = np.linspace(4,8,100) # 横坐标4~8,取一百个间隔
y1 = np.linspace(2,4.5,80)
X1,Y1 = np.meshgrid(x1,y1)
# display(X1.shape,Y1.shape)
X1 = X1.reshape(-1,1) #-1代表8000样本,1代表横坐标长度
X1.shape
Y1 = Y1.reshape(-1,1)
# X_test = np.concatenate([X1,Y1],axis = 1)
# X_test.shape
# 平铺 一维化
X1.ravel().shape
 ravel使用示例 使用前:
a = np.random.randint(0,30,size = (3,4))
a
 使用后:
a.ravel() #将数据一维化
 选用ravel来进行数据整合
# 获取测试数据
# 横坐标宽度 4~8 纵坐标2~4.5
# 背景点 取出来 meshgrid
x1 = np.linspace(4,8,100) # 横坐标4~8,取一百个间隔
y1 = np.linspace(2,4.5,80)
X1,Y1 = np.meshgrid(x1,y1)
# display(X1.shape,Y1.shape)
# X1 = X1.reshape(-1,1) #-1代表8000样本,1代表横坐标长度
# X1.shape
# Y1 = Y1.reshape(-1,1)
# # X_test = np.concatenate([X1,Y1],axis = 1)
# # X_test.shape
# # 平铺 一维化
X_test = np.c_[X1.ravel(),Y1.ravel()] #与上述方法都可以实现数据整合
X_test.shape

%%time #测试时间 一个% 只控制一行,代码需要在其后面 换行执行需要两个百分号
y_ = knn.predict(X_test) #预测数据一般都会加_来进行说明
 指定颜色来进行输出 指定颜色需要导入相应的库
from matplotlib.colors import ListedColormap
lc = ListedColormap(['red','green','blue'])
pyb.scatter(X_test[:,0],X_test[:,1],c = y_,cmap=lc)

将训练样本应用于其上
lc = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
lc2 = ListedColormap(['#FF0000','#00FF00','#0000FF'])
%%time
pyb.scatter(X_test[:,0],X_test[:,1],c = y_,cmap=lc)
pyb.scatter(X[:,0],X[:,1],c = y,cmap = lc2)
 另外一种画图方法,
与上述方法相比,消耗时间更少,绘制轮廓面比绘制散点图更加省时 图形更加圆滑,散点图的边界可以很明显的看到有齿状痕迹
%%time
# 轮廓线 等高线
pyb.contourf(X1,Y1,y_.reshape(80,100),cmap=lc)
pyb.scatter(X[:,0],X[:,1],c = y,cmap = lc2)
 整体流程
- 导包
- 加载数据并对数据进行降维处理,在之后应该采用算法降维,去除不必要的属性
- 训练数据
- meshgrid交叉组合 进行强关联 提取测试数据 8000个测试样本
- 测试数据是新用户的数据
- 使用算法进行预测 可视化
|