Fisher 线性分类器的设计与实现 线性数据与人脸分类 python

1.利用 LDA 进行一个分类的问题:假设一个产品有两个参数柔软性 A 和钢性 B来衡量它是否合格,如下图所示:
在这里插入图片描述
将数据分两组输入dataA、dataB,每条数据都是一个二元组,包含参数A、B。然后计算合格、不合格产品的数据平均值uA、uB和协方差矩阵varA、varB。经过计算:
Sw = varA+varB,W = (Sw**(-1))*(uA-uB),w = np.matmul(np.linalg.inv(Sw), (uA - uB)),b = -1 * np.dot((uA+uB)/2, w),得出w、b之后,对于样例二元组,使用np.dot(i, w)+b计算出的值,若大于0则合格,小于0则不合格。
b = -b/w[1],bb = b,记录计算中间值
k = -w[0]/w[1],b =dataA[0][0]/k+dataA[0][1],k =-1/k得出投影所在的直线并进行绘图,k=-1/k,b=bb得出划分直线所在并进行绘图。

在这里插入图片描述

# -*- coding: utf-8 -*-

import random
import copy
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import cholesky

if __name__ == '__main__':
  
    data = [[2.95,6.63],[2.53,7.79],[3.57,5.65],[3.16,5.47],[2.58,4.46],[2.16,6.22],[3.27,3.52]]#训练数据
    dataLable = [1,1,1,1,0,0,0]
  
    dataA= np.array(data[:4])
    dataB= np.array(data[4:])
  
    plt.scatter(dataA[:,0],dataA[:,1],color='blue')
    plt.scatter(dataB[:,0],dataB[:,1],color='red')
 
    uA = np.mean(dataA, axis=0)
    uB = np.mean(dataB, axis=0)
    
    varA = np.cov(dataA,rowvar = False)  
    varB = np.cov(dataB,rowvar = False) 

    Sw = varA+varB
    
    W = (Sw**(-1))*(uA-uB)
    

    w = np.matmul(np.linalg.inv(Sw), (uA - uB))
    b = -1 * np.dot((uA+uB)/2, w)
    
    test = np.array([np.array([1,1]),np.array([2,2]),np.array([2.2,2]),np.array([1,5.5]),np.array([4,3])])
    for i in test:  
        print(np.dot(i, w)+b)
    
    #for i in data:
        #print(np.dot(i, w)+b)
    
    k = -w[0]/w[1]
    b = -b/w[1]
    bb = b
    
    b =dataA[0][0]/k+dataA[0][1]
    k =-1/k
    
    x = np.array([1.5,4.0])
    y = x*k+b
    plt.plot(x, y,color='black')
    
    plt.plot(x, x*-1/k+bb,color='gold',linestyle='-')#划分界面
    
    x1= (dataA[:,1] + dataA[:,0]/k-b)/(k+1/k)
    plt.scatter(x1, k*x1+b,marker = '*',s = 200)
  
    x2= (dataB[:,1] + dataB[:,0]/k-b)/(k+1/k)
    plt.scatter(x2, k*x2+b,marker = '*',s = 200)
    
    plt.scatter(test[:,0], test[:,1],marker = '*',s = 50)
    


2.基于 ORL 人脸库,实验样本主要来自于两个人,每人 45 张图片,共有 90 个样 本,其中的 80 个样本作为训练样本,10 个作为测试样本。通过 LDA 实现两类问题的线性判别。
在这里插入图片描述
我下载的是耶鲁的人脸数据库,选取了yaleB01和yaleB02这两个人作为实验数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

计算后得出分类超平面的数据,将训练集代入后进行计算.

在这里插入图片描述
预测结果

# -*- coding: utf-8 -*-

import random
import copy
import os
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import cholesky
from PIL import Image

if __name__ == '__main__':
   
    data = []
    dataLable = []
    test = []
   
    filePath = r'C:\Users\x\Desktop\yaleB01'#读入数据
    allfile = os.listdir(filePath)
    for i in range(0,45):
        k = allfile[i]
        tmpfile = filePath+'\\' +k
        im = Image.open(tmpfile)
        im = im.resize((24, 21), Image.ANTIALIAS)
        imagearray=np.array(im)
        imagearray=imagearray.reshape(1,24*21)
        data.append(imagearray[0])
        dataLable.append(1)
    for i in range(45,50):
        k = allfile[i]
        tmpfile = filePath+'\\' +k
        im = Image.open(tmpfile)
        im = im.resize((24, 21), Image.ANTIALIAS)
        imagearray=np.array(im)
        imagearray=imagearray.reshape(1,24*21)
        test.append(imagearray[0])
   
    #print(len(data))

    filePath = r'C:\Users\x\Desktop\yaleB02'
    allfile = os.listdir(filePath)
    for i in range(0,45):
        k = allfile[i]
        tmpfile = filePath+'\\' +k
        im = Image.open(tmpfile)
        im = im.resize((24, 21), Image.ANTIALIAS)
        imagearray=np.array(im)
        imagearray=imagearray.reshape(1,24*21)
        data.append(imagearray[0])
        dataLable.append(0)
    for i in range(45,50):
        k = allfile[i]
        tmpfile = filePath+'\\' +k
        im = Image.open(tmpfile)
        im = im.resize((24, 21), Image.ANTIALIAS)
        #im.show()
        imagearray=np.array(im)
        imagearray=imagearray.reshape(1,24*21)
        test.append(imagearray[0])
        im.show()
   
    dataA= data[:45]
    dataB= data[45:]
  
    uA = np.mean(dataA, axis=0)
    uB = np.mean(dataB, axis=0)
   

    varA = np.cov(dataA,rowvar = False)  
    varB = np.cov(dataB,rowvar = False) 
  
    Sw = varA+varB
   
    W = (Sw**(-1))*(uA-uB)
   

    w = np.matmul(np.linalg.inv(Sw), (uA - uB))
    b = -1 * np.dot((uA+uB)/2, w)
  

    for i in data:  
        print(np.dot(i, w)+b)
    
    print("***********************************")    
    
    for i in test:  #输出测试集中的人脸的分类,是大于0还是小于0
        print(np.dot(i, w)+b)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值