知识点:1 参数K的个数先选训练样本总数的开方,然后再调参
2. 图片转换成矩阵用cv2.imread()
三维图片转换成2维用cv2.cvtColor()
将多张二维图片组成的三维矩阵如(1000,28,28)即1000张28*28的图片转换成二维的数据用
X_test = X_test.reshape(1000,784)或 X_test = X_test.reshape(1000, -1)
digit = cv2.imread('F:/sxt/data/0_1.bmp')
digit = cv2.cvtColor(digit, code = cv2.COLOR_BGR2GRAY)
digit.shape
plt.imshow(digit, cmap = plt.cm.autumn )
3. 将矩阵展示成图片用plt.imshow(digit) 后边一个参数调显示颜色
4. 将数据切分成测试集和训练集
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size = 0.2,random_state = 100)
5. 将类实例化
然后训练
预测的数据一般表示为字母加一个下划线 y_
看结果好坏--两种方法
注:n_jobs 电脑开启的线程数,-1即全开,开的越多运行时间越短
weights='distance', p=2 权重根据距离度量,距离越近权重越大, p为1则用曼哈顿距离,p为2则为欧氏距离。
knn = KNeighborsClassifier(n_neighbors= 63,weights='distance',p=2, n_jobs = -1)
knn.fit(X_train,y_train)
# 使用算法进行预测
# 保留了1000个数据,算法‘没见过‘这1000个数据
X_test = X_test.reshape(1000,784)
y_ = knn.predict(X_test)
# 准确率--以下两种方法都行
# (y_ == y_test).sum()/1000
print((y_ == y_test).mean())
knn.score(x_test, y_test)
6. 将图片里的数字调成完全黑白,没有灰色过渡带,提高准确率. 这里二值化对结果影响不大,验证码识别时候二值化影响会较大
# 二值化操作
for i in range(5000):
for y in range(28):
for x in range(28):
if X[i][y,x] < 200:
X[i][y,x] = 0
else:
X[i][y,x] = 255
7.np.meshgrid
二维坐标系中,X轴可以取三个值1,2,3, Y轴可以取三个值7,8, 请问可以获得多少个点的坐标?
显而易见是6个:
(1,7)(2,7)(3,7)
(1,8)(2,8)(3,8)
np.meshgrid()就是干这个的
8. ravel()函数 concatenate() 函数
X1 = X1.reshape(-1,1)
Y1 = Y1.reshape(-1,1)
X_test = np.concatenate([X1,Y1],axis = 1)
X_test.shape
x1 = x1.reshape(-1,1) # 变成8000行1列
# 平铺,一维化,reshape
# np.c_即上边的 np.concatenate的简写
X_test = np.c_[X1.ravel(),Y1.ravel()]
# X1.ravel() 与X1.reshape(-1)作用一样 将数据一维化
10. jupyternotebook 中%%time的使用
%%time执行正段代码用时
%%time
y_ = knn.predict(X_test)
%time 执行紧跟到后边的一行代码用时
%time y_ = knn.predict(X_test)
#这样写输出时间是0
%time
y_ = knn.predict(X_test)