线性回归实现人脸识别——ORL数据集

2023-11-05

今天写一个比较简单的机器学习例子
使用线性回归实现人脸识别
使用的数据集是ORL数据集

算法描述

输入:图片矩阵img,标签信息label,测试图片test

对每一个类:
第一步:从图片矩阵中读出来一类图片,划分为训练集(X)与测试集(y)
第二步:计算w
计算w

第三步:计算预测图片
计算w

第四步:计算出dis即预测图片与真实图片之间的误差,并将误差存储起来
计算w
对于每一个测试图片test,找到最小dis对应的标签label,label对test的分类

使用二折交叉验证,将原油数据集划分为两部分X1,X2;第一次将X1作为训练集,X2作为测试集;第二次将X2作为训练集,X1作为测试集。

数据集

ORL人脸数据集
使用的是:ORL_32_32.mat
使用scipy直接读取,里面包含两个矩阵,第一个矩阵是人脸的数据,第二个矩阵是标签

实验环境

python 3.6
macOS 10.12

上代码

比较简单就直接放代码了
注释也比较详细

使用二折交叉验证,我直接把二折写死了,如果是n折的话,可以用循环去写。
二折的思路比较简单:第一次选取每一类前五张照片做训练集,后五张照片做测试集,第二次选取每一类前五张照片做测试集,后五张照片做训练集。

import scipy.io as sio
import random
import numpy as np

#使用scipy读取mat文件
mat=sio.loadmat('ORL_32_32.mat')
img=mat['alls']
label=mat['gnd']

count=0
acc_sum=0
#测试100次,每一次都计算一下准确率
for iter in range(1):
    #对40个类中的图片 随机取样 用于测试
    for i in range(40):
        index = random.sample(range(0, 10), 1) #计算一组随机数
        totest = img[:, i * 10 + index[0]:i * 10 + index[0] + 1] #在每个类中随机取出一张图片
        tolabel = label[0][i * 10] #取出该图片对应的标签
        dislist = [] #建立一个list 用于存储距离
        #对每一个类都进行一次线性回归
        for j in range(40):
            batch_img = img[:, j * 10:j * 10 + 10] #取出一个batch,其中包含了测试集与训练集

            #二折交叉验证 对训练集与测试集进行划分
            # 第一次  batch中的前五个数据 作为训练集 后五个数据作为测试集合
            train_img = batch_img[:, 0:5]
            test_img = batch_img[:, 5:10]
            #将训练集合与测试集合转换为矩阵
            xMat = np.mat(train_img / 255)
            yMat = np.mat(test_img / 255)
            #计算w
            xTx = xMat.T * xMat
            w = xTx.I * xMat.T * yMat
            # w = np.linalg.solve(xTx, xMat.T * yMat) #可能会出现矩阵非正定的情况,这个时候使用np.linalg.solve解决
            #计算出一张预测的图片
            y_pred_1 = train_img * w


            # 第二次  batch中的前五个数据 作为测试集合 后五个数据作为训练集
            train_img = batch_img[:, 5:10]
            test_img = batch_img[:, 0:5]
            # 将训练集合与测试集合转换为矩阵
            xMat = np.mat(train_img / 255)
            yMat = np.mat(test_img / 255)
            #计算w
            xTx = xMat.T * xMat
            w = xTx.I * xMat.T * yMat
            # w = np.linalg.solve(xTx, xMat.T * yMat)  #可能会出现矩阵非正定的情况,这个时候使用np.linalg.solve解决
            #计算出一张预测的图片
            y_pred_2 = train_img * w

            #计算预测图片与真实图片之间的误差
            dis = (y_pred_1 + y_pred_2) / 2 - totest

            #对误差计算二范数,得到欧式距离  将这些距离存储dislist中
            dislist.append(np.linalg.norm(dis, ord=2))

        #取出误差最小的预测图片 并找到他对应的标签 作为预测结果输出
        label_pridect = dislist.index(min(dislist))

        #count用于计算准确率
        if (label_pridect + 1 == tolabel):
            count = count + 1
            # print(label_pridect)
    print('acc:', count / 40)
    acc_sum =acc_sum+count/40
    count=0
print('total acc',acc_sum/100)

这里再给出使用留出法的代码

count=0
#对40个类中的图片 随机取样 用于测试
for i in range(40):
    totest=img[:,i*10+7:i*10+8]
    tolabel = label[0][i*10]
    dislist=[]
    for j in range(40):
        train_img = img[:, j * 10:j * 10 + 9] #每一类图片的前9个作为训练集
        test_img = img[:, j*10+9:j*10+10] #每一类图片的最后一个作为测试集
        xMat = np.mat(train_img / 255)
        yMat = np.mat(test_img / 255)
        #计算w
        xTx = xMat.T * xMat
        w = xTx.I * xMat.T * yMat
        y_pred = train_img * w
        #计算真实值于预测值的误差
        dis=y_pred - totest
        dislist.append(np.linalg.norm(dis, ord=2))
    #取出误差最小的预测图片 并找到他对应的标签 作为预测结果输出
    label_pridect=dislist.index(min(dislist))
    if(label_pridect+1==tolabel):
        count=count+1
    print(label_pridect)
print('acc:',count/40)

训练结果

留出效果可以说是非常好了,几乎100%,二折训练集会少一些,所以效果差一点。
跑了十次二折的结果

计算w

跑了100次二折求平均的结果

计算w

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性回归实现人脸识别——ORL数据集 的相关文章

随机推荐

  • pandas中的时间序列

    一 夯实基础 datetime 模块中的数据类型 date 以公历形式存储日历日期 年月日 time 将时间存储为时分秒毫秒 datetime 存储日期和时间 timedelta 表示两个datetime值之间的差 日 秒 毫秒 1 获取当
  • 无效数据处理攻略: 如何从源头开始预防无效数据带来的风险

    数据处理在现代社会中变得越来越重要 而对于数据的可靠性和准确性 我们始终非常关注 然而 即使在对数据进行了精心管理的情况下 无效数据依然可能存在 并可能对数据分析和决策带来不良影响 因此 处理无效数据变得愈发重要 一 什么是无效数据 在处理
  • app数据分析体系 - 用户粘性 DAU,MAU 和 月人均活跃天数

    用户粘性指标 DAU MAU 月均活跃天数 DAU 和 MAU 日活跃用户占月活跃用户的比例越高 表明用户对App的使用粘性越高 DAU 即 Daily Active User 指日活跃用户数 MAU 即 Monthly Active Us
  • 后端进阶之路——深入理解Spring Security配置(二)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 后端进阶之路 文章
  • A/B测试是什么?面试官把我问懵了!

    什么是A B测试 A B测试是为 web 或 app 界面或流程制作两个 A B 或多个版本 在同一时间维度 分别让组成成分相同 相似 的访客群组 目标人群 随机的访问这些版本 收集各群组的用户体验数据和业务数据 最后分析 评估出最好版本
  • Golang 枚举详解

    什么是枚举 枚举 Enumeration 是一种常见的编程概念 它定义了一组命名常量 我们知道在 Go 语言中定义常量是这样的形式 const A a B b 开发者可以使用枚举创建复杂的 有限的常量集 这些常量集具有有意义的名称和唯一的值
  • 将 Bean 注入 Spring 容器的方法

    这里写目录标题 1 Configuration Bean 2 Componet ComponentScan 3 Import 注解导入 3 1 Import 直接导入类 3 2 Import ImportSelector接口 3 3 Imp
  • Microsoft Visual Studio 2013产品激活密钥

    win7 win8 win10系统下Visual Studio 2013各个版本的密钥 Visual Studio Ultimate 2013 KEY BWG7X J98B3 W34RT 33B3R JVYW9 Visual Studio
  • unity3D 物体跟随移动

    脚本挂载移动的物体上 public class Player MonoBehaviour public float Speed 4 Use this for initialization void Start Update is calle
  • c++打怪小游戏——修仙之路1.5

    这次我们要出示的程序是修仙之路1 5版本的 这个程序在c 打怪小游戏 修仙之路1 0多加了好几个功能 这次我们在这个程序中多加了一些代码 我们为下面的优化多准备一个头文件 include
  • MAVEN在IDEA中的应用

    idea集成maven插件 settings gt 输入maven gt 选择本地maven安装路径 配置文件以及本地仓库的路径 创建非web的maven工程 创建工程 gt 选择maven 下一步之后填写项目的坐标 类似于全类名 下一步之
  • Zotero win10/mac/iPad三台设备同步

    刚入坑Zotero 发现同步功能很强大 刚好手上有三台设备 就试着捣鼓了下 最终结果不错 记录一下 参考来源 https sspai com post 64283 少数派 用 Zotero 坚果云搞定多设备文献管理 https blog c
  • 虚拟机中linux_server搭建

    linux server environment 1 Installation in vmware workstation 1 1 steps 略 普通的虚拟机系统安装模式 2 linux 中存储设备的使用 linux 中所有存储设备都是通
  • 华为云服务器无法ssh连接&&可以公网ip访问

    基本是SSH服务没有打开的原因 在华为的配置里面默认打开了22号端口 但是需要修改ssh配置文件 首先从华为云服务管理界面远程登录进去 然后会看到 然后登陆之后修改ssh的配置文件 sudo vi etc ssh sshd config 将
  • Scrapy 爬虫完整案例—从小白到大神(银行网点信息为例)

    采用selenium界面抓取信息 需要渲染界面 并且也是单线程操作 效率极低 一晚上只爬去了一个工行的数据 突然想到了分布式爬虫 安装 Scrapy pip版本过于老旧不能使用 需要升级pip版本 输入python m pip instal
  • OpenCV学习三十三:pointPolygonTest 检测点是否在轮廓内

    opencv函数 pointPolygonTest C double pointPolygonTest InputArray contour Point2f pt bool measureDist 用于测试一个点是否在多边形中 当measu
  • 云计算知识点

    一 理解云计算 一 云计算的基本概念 1 定义 云计算是以服务的形式 按需向用户提供计算资源的一种模式 它是分布式计算的一种特殊形式 引入了效用模型来远程供给可扩展和可测量的资源 2 基本要点 提供IT资源 包括计算 存储以及网络资源 提供
  • 用MATLAB实现雅克比迭代、高斯-赛德尔迭代以及超松弛迭代

    文章目录 前言 一 解线性方程组的方法 二 解线性方程组的迭代法及其代码实现 1 迭代法的收敛性 2 基本参数设置 3 雅克比 Jacobi 迭代 4 高斯 塞德尔 Gauss Seidel 迭代 5 超松弛 SOR 迭代 总结 前言 近期
  • 在opencv3中的机器学习算法

    在opencv3 0中 提供了一个ml cpp的文件 这里面全是机器学习的算法 共提供了这么几种 1 正态贝叶斯 normal Bayessian classifier 我已在另外一篇博文中介绍过 在opencv3中实现机器学习之 利用正态
  • 线性回归实现人脸识别——ORL数据集

    今天写一个比较简单的机器学习例子 使用线性回归实现人脸识别 使用的数据集是ORL数据集 算法描述 输入 图片矩阵img 标签信息label 测试图片test 对每一个类 第一步 从图片矩阵中读出来一类图片 划分为训练集 X 与测试集 y 第