KNN近邻法
邻近算法,或者说K最邻近(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法
- 使用open()函数打开文件,对文件进行操作
- 使用os.listdir()函数获取下trainingDigits文件夹下的所有经过处理的手写数字(已转换成0,1代码)如下图所示 ,返回文件名的列表
- 通过对trainingDigits文件夹下的文件(文件中共32*32个01代码)进行循环读入一个数组中,每个文件形成一个[1,1024]这样的数组作为训练的数据集,将自己写的图片转为灰度图,并改变尺寸变为[1,1024]这样的数组作为测试的数据集,使用文件名的第一个数字作为训练的标签集([0,......1,......2.....,.....,9......])
- 构造KNN分类器对象,学习训练,并进行预测
代码如下:
import cv2
from sklearn.neighbors import KNeighborsClassifier
import os
import numpy as np
np.set_printoptions(threshold=np.inf)
def load_data():
fileList = os.listdir("./trainingDigits")
x = []#训练的数据集
y = []#训练的标签集
# for循环得到:['0_0.txt', '0_1.txt', '0_10.txt', ...]
for j in range(len(fileList)):
# 得到文件名
filename = fileList[j]
with open("./trainingDigits/" + filename, 'r') as fd:
list1 = []
# 两个for循环:将一个文件中的数据写入形成[1,1024]这样的数据
for i in range(32):
data = fd.readline()#读出文件的每一行
for j in data[:-1]:#换行符不读
list1.append(int(j))
x.append(list1)#形成[1,1024]这样的数组
y.append(int(filename[0])) #形成[0,0,.....,1,1,....,......,9,...]这样的标签集
return x, y
# 处理写的图片,在画图中将背景颜色喷成黑色,拿白色的画笔写数字,
# 将画纸大小设为100*100的大小(需要是个正方形)
def getTestData(img):
src = cv2.imread(img)
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)#将图片转为灰度图
gray = cv2.resize(gray, (32, 32))#改变图片大小,变为[32,32]
# print(gray)
gray = gray.reshape(1, 1024)#改变数组形状[32,32]->[1,1024]
return gray
if __name__ == "__main__":
x_test = []
# 1.获得trainingDigits目录中的数据训练集和标签集
x_train, y_train = load_data()
# 2.准备测试的数据集
x_test.append(getTestData("7.png"))
# 3.构造knn分类器对象
knn = KNeighborsClassifier(n_neighbors=3)# k需要为奇数
# 4.学习训练
knn.fit(x_train, y_train)
# 5.预测
pre = []
print("识别:", pre[i])
# 识别: [7]
画图: