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)