%读取数据
train_img=loadMNISTImages('train-images.idx3-ubyte');
train_lab=loadMNISTLabels('train-labels.idx1-ubyte');
test_img=loadMNISTImages('t10k-images.idx3-ubyte');
test_lab=loadMNISTLabels('t10k-labels.idx1-ubyte');
idata=cell(10,1);
imu=cell(10,1);
mimu=cell(10,1);
isigma=cell(10,1);
p=zeros(1,10);
for i=1:10
a=find(train_lab==(i-1));
idata{i}=train_img(:,a);
imu{i}=mean(idata{i},2);
b=size(a,1);
p(i)=b/60000;
mimu{i}=repmat(imu{i},1,b); %将均值列向量复制拓展为784*b的矩阵
isigma{i}=(idata{i}-mimu{i})*(idata{i}-mimu{i})'/b; %第i类图像的协方差
wisigma{i}=isigma{i}+0.05*eye(784); %加单位制使协方差矩阵非奇异
end
smu=mean(train_img,2); %求所有训练样本的均值
msmu=repmat(smu,1,60000);
ssigma=(train_img-msmu)*(train_img-msmu)'/60000; %求协方差矩阵
ssigma=ssigma+0.05*eye(784); %使协方差矩阵非奇异
%LDF分类
w=cell(10,1);
w0=cell(10,1);
c=zeros(1,10);
sum=0;
for i=1:10
w{i}=inv(ssigma)*imu{i}; %LDF分类器的权向量
w0{i}=-0.5*(imu{i})'*(inv(ssigma))*imu{i}+log(p(i));%LDF分类器的偏置
end
for i=1:10000
for j=1:10
c(j)=w{j}'*test_img(:,i)+w0{j}; %将第i个样本带入第j类分类器
end
[~,I]=max(c); %判决规则
if(I==(test_lab(i)+1))
sum=sum+1; %记录判断正确的个数
end
end
ldfrate=sum./10000 %LDF分类器的正确率
%QDF分类
Z=cell(10,1);
z=cell(10,1);
z0=cell(10,1);
d=zeros(1,10);
sum=0;
for i=1:10
Z{i}=-0.5*inv(wisigma{i});
z{i}= inv(wisigma{i})*imu{i};
z0{i}=-0.5*(imu{i})'*(inv(wisigma{i}))*imu{i}+log(p(i)); %-0.5*log(det(wisigma{i}))省去,因为det(wisigma{i})的值为0
end
for i=1:10000
for j=1:10
d(j)=(test_img(:,i))'*Z{j}*test_img(:,i)+(z{j})'*test_img(:,i)+z0{j};
end
[~,I]=max(d);
if(I==(test_lab(i)+1))
sum=sum+1;
end
end
qdfrate=sum/10000