PCA和Softmax分类比较—Mnist与人脸数据集
PCA人脸识别中三种方法得到的正确率可达到100%
作为对比,单独使用Softmax回归对人脸40*10*92*112的数据分类正确率为97%。
用PCA对MNIST手写数字10*500*28*28识别,也可以达到相对比较高的正确率,马氏距离h=32时正确率为0.93 (在softmax中为0.85~0.89)。
# coding:utf8
import numpy as np
import os
import sf
import pca if __name__ == '__main__':
img=pca.load_img()
test=img
print np.mat(img).shape
label=[a+1 for a in range(40) for j in range(10)]
index=range(400)
np.random.shuffle(index)
label_=[label[i] for i in index]
test_=np.mat([test[i] for i in index]) softmax = sf.SoftMax(MAXT=200, step=0.03, landa=0.01)
softmax.process_train(np.mat(img),np.array(label),40)
softmax.validate(test_,np.array(label_))
# correctnum = 390, sumnum = 400, Accuracy:0.97
#coding:utf8
import cv2
import numpy as np
import matplotlib.pyplot as plt
import cPickle TYPE_NUM=10 #
SAMPLE_NUM=500 # def load_img():
img=[]
for i in range(40):
for j in range(10):
path='att_faces\\s'+str(i+1)+'\\'+str(j+1)+'.pgm'
a=cv2.imread(path,0)
a=a.flatten()/255.0
img.append(a)
return img def dis(A,B,dis_type=0,s=None):
if dis_type==1: # 欧式距离
return np.sum(np.square(A-B))
elif dis_type==2: # 马式距离
f=np.sqrt(abs(np.dot(np.dot((A-B),s.I),(A-B).T))) # h增大时会出现负值
return f.tolist()[0][0]
else: # 曼哈顿距离
return np.sum(abs(A-B)) def pca(data,h,dis_type=0):
q,r=np.linalg.qr(data.T)
u,s,v=np.linalg.svd(r.T)
fi=np.dot(q,(v[:h]).T)
y=np.dot(fi.T,data.T)
ym=[np.mean(np.reshape(x,(TYPE_NUM,SAMPLE_NUM)),axis=1) for x in y]
ym=np.reshape(ym,(h,TYPE_NUM))
c=[]
if dis_type==2:# 计算马氏距离的额外处理"
yr=[np.reshape(x,(TYPE_NUM,SAMPLE_NUM)) for x in y]
yr=[[np.array(yr)[j][k] for j in range(h)]for k in range(TYPE_NUM)]
for k in yr:
k=np.reshape(k,(h,SAMPLE_NUM))
e=np.cov(k)
c.append(e)
return fi,ym,c def validate(fi,ym,test,label,dis_type=0,c=None):
ty=np.dot(fi.T,test.T)
correctnum=0
testnum=len(test)
for i in range(testnum):
if dis_type==2:
n=len(ym.T)
dd=[dis(ty.T[i],ym.T[n_],dis_type,np.mat(c[n_])) for n_ in range(n)]
else:
dd=[dis(ty.T[i],yy,dis_type) for yy in ym.T]
if np.argsort(dd)[0]==label[i]: # mnist中从0开始
correctnum+=1
rate = float(correctnum) / testnum
print "Correctnum = %d, Sumnum = %d" % (correctnum, testnum), "Accuracy:%.2f" % (rate)
return rate if __name__ == '__main__':
f = open('mnist.pkl', 'rb')
training_data, validation_data, test_data = cPickle.load(f)
training_inputs = [np.reshape(x, 784) for x in training_data[0]]
data = np.array(training_inputs[:10000])
training_inputs = [np.reshape(x, 784) for x in validation_data[0]]
vdata = np.array(training_inputs[:5000])
f.close()
label=training_data[1][:10000]
c=np.argsort(label)
l=[label[x] for x in c]
d=[data[x] for x in c]
data_new=[]
label_new=[]
temp=-1000
for i in range(10): # 将数据整理为10类各500个样本依次排列
id= l.index(i)
if id-temp<500:
print "<500"
break
data_new.append(d[id:id+500])
label_new.append(l[id:id+500]) # PCA中不需要,用于在Softmax中验证数据
temp=id
lb=np.array(label_new).flatten()
data_=[]
for j in data_new:
data_+=j
x_=[2**i for i in range(9)]
d_=['Manhattan Distance','Euclidean Metric', 'Mahalanobis Distance']
for j in range(3):
y_=[]
plt.figure()
for i in range(9):
fi,ym,c=pca.pca(np.mat(data_),h=x_[i],dis_type=j)
y_.append(pca.validate(fi,ym,vdata, validation_data[1][:5000],dis_type=j,c=c))
plt.ylim([0,1.0])
plt.plot(x_,y_)
plt.scatter(x_,y_)
plt.xlabel('h')
plt.ylabel('Accuracy')
plt.title(d_[j])
plt.show()



PCA和Softmax分类比较—Mnist与人脸数据集的更多相关文章
- TensorFlow实战第五课(MNIST手写数据集识别)
Tensorflow实现softmax regression识别手写数字 MNIST手写数字识别可以形象的描述为机器学习领域中的hello world. MNIST是一个非常简单的机器视觉数据集.它由 ...
- 利用sklearn对MNIST手写数据集开始一个简单的二分类判别器项目(在这个过程中学习关于模型性能的评价指标,如accuracy,precision,recall,混淆矩阵)
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- matlab练习程序(神经网络识别mnist手写数据集)
记得上次练习了神经网络分类,不过当时应该有些地方写的还是不对. 这次用神经网络识别mnist手写数据集,主要参考了深度学习工具包的一些代码. mnist数据集训练数据一共有28*28*60000个像素 ...
- 机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集
机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集 选自Microsoft www.tz365.Cn 作者:Lee Scott 机器之心编译 参与:李亚洲.吴攀. ...
- 机器学习:PCA(实例:MNIST数据集)
一.数据 获取数据 import numpy as np from sklearn.datasets import fetch_mldata mnist = fetch_mldata("MN ...
- 用Kersa搭建神经网络【MNIST手写数据集】
MNIST手写数据集的识别算得上是深度学习的”hello world“了,所以想要入门必须得掌握.新手入门可以考虑使用Keras框架达到快速实现的目的. 完整代码如下: # 1. 导入库和模块 fro ...
- TensorFlow——MNIST手写数据集
MNIST数据集介绍 MNIST数据集中包含了各种各样的手写数字图片,数据集的官网是:http://yann.lecun.com/exdb/mnist/index.html,我们可以从这里下载数据集. ...
- TensorFlow系列专题(六):实战项目Mnist手写数据集识别
欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 目录: 导读 MNIST数据集 数据处理 单层隐藏层神经网络的实现 多层隐藏层神经 ...
- 使用tensorflow的softmax进行mnist识别
tensorflow真是方便,看来深度学习需要怎么使用框架.如何建模- ''' softmax classifier for mnist created on 2019.9.28 author: vi ...
随机推荐
- 操作系统:cpu调度 6-25
1. 进程选择 1小时和1分钟? 进程优先1分钟,再执行1小时. 时间短的进程先执行,执行顺序也有关. 2. 遇到io操作,执行的进程先让出cpu,切换其他进程. 3.进程先来先服务,进程调度策略: ...
- 自定义UIAlertView
You can change accessoryView to any own customContentView in a standard alert view in iOS7 [alertVie ...
- 层次分析模型(AHP)及其MATLAB实现
今天用将近一天的时间学习了层次分析模型(AHP),主要参考了一份pdf,这个网站,和暨南大学章老师的课件,现写出一些自己总结的要点. 一.层次分析法的基本步骤: 角度一: 实际问题——分解——> ...
- WCF中DataContractAttribute 类
一.这个类的作用 使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档.无法继承此类,(DataContractSerializer 用于序列化和反序列化在 Windows Commun ...
- Use XML in Windows Phone 8.0
I have an XML file stored in DataModel folder, the structure is shown as below: <?xml version=&qu ...
- Js全选,插入实现
//全选 function CheckAll() { ids.splice(0, 1000000); var flag = $("#All_Check").attr("c ...
- oracle数据库什么情况下创建索引比较好
索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽 然说,在表中 ...
- Howto add permanent static routes in Ubuntu
Static routing is the term used to refer to the manual method used to set up routing. An administrat ...
- X86平台乱序执行简要分析(翻译为主)
多处理器使用松散的内存模型可能会非常混乱,写操作可能会无序,读操作可能会返回不是我们想要的值,为了解决这些问题,我们需要使用内存栅栏(memory fences),或者说内存屏障(memory bar ...
- 【Avalon】escape
[\uD800-\uDBFF][\uDC00-\uDFFF] var rsurrogate = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g var rnoalphanumeri ...