基于KNN的数字识别

数据集

链接:数据集及python代码
提取码:sp8c

python实现

模块Identify_KNN_python.py

# coding:utf-8
"""
    基于KNN的数字识别--python实现
"""
import os
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MinMaxScaler
from KNN_python import classify

def img2vector(filename):
    """
        将每个文件中32*32的矩阵数据(图片),转换到1*1024一行
    """
    # 创建一个1行1024列的数组
    sample = np.zeros((1, 1024))
    
    # 打开当前的文件
    f = open(filename, "rb")
    # 每个文件中有32行,每行有32列数据,遍历32个行,将32个列数据放入1024的列中
    for i in range(32):
        cur_line = f.readline()
        
        for j in range(32):
            sample[0, 32 * i + j] = int(cur_line[j])
            
    return sample


def train_model():
    labels = []
    # 读取 TrainData目录下所有的文件
    train_files = os.listdir('TrainData')
    m = len(train_files)
    # zeros((m,1024)) 返回一个m行 ,1024列的数组
    X = np.zeros((m, 1024))
    
    
    #获取所有的训练样本
    for i in range(m):
        # 获取文件名称
        file_name = train_files[i]
        
        # 获取文件除了后缀的名称
        base_name = file_name.split('.')[0]
        
        # 获取文件"数字"的类别
        digit = int(base_name.split('_')[0])
        labels.append(digit)
        # 构建训练集, img2vector  每个文件返回一行数据 1024列
        X[i] = img2vector('TrainData/%s' % file_name)
        
        
    # 读取测试样本
    test_files = os.listdir('TestData')
    
    #错误样本数
    error_count = 0.0
    m_test = len(test_files)
    for i in range(m_test):
        file_name = test_files[i]
        base_name = file_name.split('.')[0]
        true_digit = int(base_name.split('_')[0])
        sample = img2vector('TestData/%s' % file_name)
        pred_digit = classify(sample.ravel(), X, labels, 3)
        
        print("识别出的数字是: %d, 真实数字是: %d" % (pred_digit,true_digit))
        if (pred_digit != true_digit):
            error_count += 1.0
    
    print("\n识别错误次数 %d" % error_count)
    error_rate = error_count / float(m_test)
    print("\n正确率: %f" % (1 - error_rate))


if __name__ == '__main__':
#    IdentifImgClassTest()
   train_model()

sklearn实现

模块Identify_KNN_sklearn.py

# coding:utf-8
"""
    基于KNN的数字识别--python实现
"""
import os
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import accuracy_score
from Identify_KNN_python import img2vector


def extract_samples(dir_):
    """
        dir_:给定一个目录,抽取其中的样本
        return  X:特征集
                y:标记
    """
    
    #训练集类别标记
    y = []
    # 读取 TrainData目录下所有的文件
    files = os.listdir(dir_)
    m = len(files)
    # zeros((m,1024)) 返回一个m行 ,1024列的数组
    X = np.zeros((m, 1024))
    
    
    #获取所有的样本
    for i in range(m):
        # 获取文件名称
        file_name = files[i]
        
        # 获取文件除了后缀的名称
        base_name = file_name.split('.')[0]
        
        # 获取文件"数字"的类别
        digit = int(base_name.split('_')[0])
        y.append(digit)
        # 构建训练集, img2vector  每个文件返回一行数据 1024列
        X[i] = img2vector('TrainData/%s' % file_name)
        
    return X,y



if __name__ == '__main__':
    #抽取训练集,测试集
    X_train,y_train = extract_samples("TrainData")
    
    X_test,y_test = extract_samples("TestData")
    
    #实例化模型
    knn = KNeighborsClassifier(n_neighbors=3,weights="uniform")
    knn.fit(X_train,y_train)
    
    #预测测试样本
    y_pred= knn.predict(X_test)
    
    #准确率
    acc = accuracy_score(y_test,y_pred)
    
    print("预测准确率:",acc)


猜你喜欢

转载自blog.csdn.net/weixin_45228198/article/details/113880354
今日推荐