从零使用SVM(支持向量积)进行模糊数字分类

简介: 代码如下

数据集

这里下载这俩即可

2345_image_file_copy_49.jpg

分别读入训练数据和测试数据

 # 加载训练集数据以及测试集数据
    print('Load Training File Start...')
    # data = pd.read_csv('optdigits.tra', header=None)
    # x, y = data[list(range(64))], data[64]
    # x, y = x.values, y.values
    data = np.loadtxt('optdigits.tra', dtype=np.float, delimiter=',')
    x, y = np.split(data, (-1,), axis=1)
    images = x.reshape(-1, 8, 8)
    print('images.shape = ', images.shape)
    y = y.ravel().astype(np.int)
    print('Load Test Data Start...')
    data = np.loadtxt('optdigits.tes', dtype=np.float, delimiter=',')
    x_test, y_test = np.split(data, (-1,), axis=1)
    print(y_test.shape)
    images_test = x_test.reshape(-1, 8, 8)
    y_test = y_test.ravel().astype(np.int)
    print('Load Data OK...')

绘制部分训练集图像

 # 画出部分训练集图像
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = False
    plt.figure(figsize=(15, 9), facecolor='w')
    for index, image in enumerate(images[:16]):
        plt.subplot(4, 8, index + 1)
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
        plt.title('训练图片: %i' % y[index])
    for index, image in enumerate(images_test[:16]):
        plt.subplot(4, 8, index + 17)
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
        # save_image(image.copy(), index)
        plt.title('测试图片: %i' % y_test[index])
    plt.tight_layout()
    plt.show()

如下图

2345_image_file_copy_50.jpg

建模训练并预测

 #  建模训练并做预测
    model = svm.SVC(C=1, kernel='rbf', gamma=0.001)
    print('Start Learning...')
    t0 = time()
    model.fit(x, y)
    t1 = time()
    t = t1 - t0
    print('训练+CV耗时:%d分钟%.3f秒' % (int(t / 60), t - 60 * int(t / 60)))
    # print '最优参数:\t', model.best_params_
    # clf.fit(x, y)
    print('Learning is OK...')
    print('训练集准确率:', accuracy_score(y, model.predict(x)))
    y_hat = model.predict(x_test)
    print('测试集准确率:', accuracy_score(y_test, model.predict(x_test)))
    print(y_hat)
    print(y_test)

输出

2345_image_file_copy_51.jpg

寻找预测错误的数据

# 寻找预测错误数据
    err_images = images_test[y_test != y_hat]
    err_y_hat = y_hat[y_test != y_hat]
    err_y = y_test[y_test != y_hat]
    print(err_y_hat)
    print(err_y)

绘制部分预测错误的数据与预测值

# 画出部分预测错误数据
    plt.figure(figsize=(10, 8), facecolor='w')
    for index, image in enumerate(err_images):
        if index >= 12:
            break
        plt.subplot(3, 4, index + 1)
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
        plt.title('错分为:%i,真实值:%i' % (err_y_hat[index], err_y[index]))
    plt.tight_layout()
    plt.show()

如下图

2345_image_file_copy_52.jpg

全部代码

if __name__ == "__main__":
    # 加载训练集数据以及测试集数据
    print('Load Training File Start...')
    # data = pd.read_csv('optdigits.tra', header=None)
    # x, y = data[list(range(64))], data[64]
    # x, y = x.values, y.values
    data = np.loadtxt('optdigits.tra', dtype=np.float, delimiter=',')
    x, y = np.split(data, (-1,), axis=1)
    images = x.reshape(-1, 8, 8)
    print('images.shape = ', images.shape)
    y = y.ravel().astype(np.int)
    print('Load Test Data Start...')
    data = np.loadtxt('optdigits.tes', dtype=np.float, delimiter=',')
    x_test, y_test = np.split(data, (-1,), axis=1)
    print(y_test.shape)
    images_test = x_test.reshape(-1, 8, 8)
    y_test = y_test.ravel().astype(np.int)
    print('Load Data OK...')
    # x, x_test, y, y_test = train_test_split(x, y, test_size=0.4, random_state=1)
    # images = x.reshape(-1, 8, 8)
    # images_test = x_test.reshape(-1, 8, 8)
    # 画出部分训练集图像
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = False
    plt.figure(figsize=(15, 9), facecolor='w')
    for index, image in enumerate(images[:16]):
        plt.subplot(4, 8, index + 1)
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
        plt.title('训练图片: %i' % y[index])
    for index, image in enumerate(images_test[:16]):
        plt.subplot(4, 8, index + 17)
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
        # save_image(image.copy(), index)
        plt.title('测试图片: %i' % y_test[index])
    plt.tight_layout()
    plt.show()
    # params = {'C':np.logspace(0, 3, 7), 'gamma':np.logspace(-5, 0, 11)}
    # model = GridSearchCV(svm.SVC(kernel='rbf'), param_grid=params, cv=3)
    #  建模训练并做预测
    model = svm.SVC(C=1, kernel='rbf', gamma=0.001)
    print('Start Learning...')
    t0 = time()
    model.fit(x, y)
    t1 = time()
    t = t1 - t0
    print('训练+CV耗时:%d分钟%.3f秒' % (int(t / 60), t - 60 * int(t / 60)))
    # print '最优参数:\t', model.best_params_
    # clf.fit(x, y)
    print('Learning is OK...')
    print('训练集准确率:', accuracy_score(y, model.predict(x)))
    y_hat = model.predict(x_test)
    print('测试集准确率:', accuracy_score(y_test, model.predict(x_test)))
    print(y_hat)
    print(y_test)
    # 寻找预测错误数据
    err_images = images_test[y_test != y_hat]
    err_y_hat = y_hat[y_test != y_hat]
    err_y = y_test[y_test != y_hat]
    print(err_y_hat)
    print(err_y)
    # 画出部分预测错误数据
    plt.figure(figsize=(10, 8), facecolor='w')
    for index, image in enumerate(err_images):
        if index >= 12:
            break
        plt.subplot(3, 4, index + 1)
        plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
        plt.title('错分为:%i,真实值:%i' % (err_y_hat[index], err_y[index]))
    plt.tight_layout()
    plt.show()


目录
相关文章
|
1天前
|
算法 搜索推荐
解读双编码器和交叉编码器:信息检索中的向量表示与语义匹配
在信息检索领域(即从海量数据中查找相关信息),双编码器和交叉编码器是两种至关重要的工具。它们各自拥有独特的工作机制、优势和局限性。本文将深入探讨这两种核心技术。
10 3
解读双编码器和交叉编码器:信息检索中的向量表示与语义匹配
|
5月前
|
监控 算法 图计算
图像处理之积分图应用三(基于NCC快速相似度匹配算法)
图像处理之积分图应用三(基于NCC快速相似度匹配算法)
73 0
|
6月前
|
算法
R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
7.3 向量的数量积与向量积
7.3 向量的数量积与向量积
54 0
概率论笔记(五)随机向量/多元随机变量
概率论笔记(五)随机向量/多元随机变量
92 0
|
算法
如何使用PCA去除数据集中的多重共线性
如何使用PCA去除数据集中的多重共线性
297 0
如何使用PCA去除数据集中的多重共线性
|
机器学习/深度学习 传感器 算法
【分类-SVDD】基于支持向量数据描述 (SVDD) 的多类分类算法附matlab代码
【分类-SVDD】基于支持向量数据描述 (SVDD) 的多类分类算法附matlab代码
|
搜索推荐 数据挖掘 Shell
高维特征索引 | 学习笔记
快速学习高维特征索引,介绍了高维特征索引系统机制, 以及在实际应用过程中如何使用。
高维特征索引 | 学习笔记
|
机器学习/深度学习 自然语言处理
机器学习(四)通过递归的矩阵向量空间预测组合语义
单字矢量空间模型已经在学习词汇信息方面非常成功。但是,它们无法捕捉到更长的短语的位置意义,这样就阻碍了它们对语言的深入理解。我们介绍一种递归神经网络(RNN)模型,该模型学习任意句法类型和长度的短语和句子的组合向量表示。我们的模型为解析树中的每个节点分配向量和矩阵:向量捕获组成部分的固有含义,而矩阵捕获它如何改变相邻单词或短语的含义。这种矩阵向量RNN可以学习命题逻辑的运算符和自然语言的含义。该模型在三个不同的实验中获得最显著的表现:预测副词形容词对的细粒度情感分布;对电影评论的情感标签进行分类,并使用他们之间的句法路径对名词之间的因果关系或主题信息进行分类。
195 0
机器学习(四)通过递归的矩阵向量空间预测组合语义