因为区域是一维的,所以体积为
。
Parzen公式为
。
5PCzVD7HxA
故女生的条件概率密度为
男生的条件概率密度为
根据贝叶斯决策规则
知
如果
,否则,
。
流程图如下:
2、要求是同时采用身高和体重数据作为特征,用Fisher线性判别方法求分类器,将该分类器应用到训练和测试样本,考察训练和测试错误情况。
将训练样本和求得的决策边界画到图上,同时把以往用Bayes方法求得的分类器也画到图上,比较结果的异同。
jLBHrnAILg
说明,取男生和女生的先验概率分别为0.5,0.5。
在设计贝叶斯分类器时,首先求各类样本均值向量,及
,然后求各个样本的来内离散度矩阵,及
,再求出样本的总类内离散度,及
,根据公式
求出把二维X空间投影到一维Y空间的最好的投影方向。
再求出一维Y空间中各类样本均值
,其中
本次实验的分界阈值我们用如下方法得到:
最后,将测试样本中的值代入,求出y,并将其与y0来进行比较来分类。
xHAQX74J0X
根据课本对Fisher线性判别法的介绍,得到的算法流程图如下:
3、选择上述或以前实验的任意一种方法,用留一法在训练集上估计错误率,与在测试集上得到的错误率进行比较。
LDAYtRyKfE
这里我们选择Fisher线性判别法,用留一法来估计它在训练集上的错误率,并将结果与Fisher线性判别法对测试集进行判别时得到的错误率进行比较。
Zzz6ZB2Ltk
具体流程图如下:
四、实验结果及分析总结
1、得到结果如下表
以身高作为特征
h=4
估计方法
女生先验概率
男生先验概率
男生错误个数
女生错误个数
总错误
男生错误率
女生错误率
总错误率
Parzen窗法
0.25
0.75
22
8
30
16%
8.8%
10%
0.5
0.5
34
4
38
13.6%
8%
12.67%
0.75
0.25
80
2
82
32%
4%
27.33%
最大似然Bayes
0.25
0.75
20
6.667%
0.5
0.5
27
9%
0.75
0.25
60
20%
以身高与体重作为特征
h=7
估计方法
女生先验概率
男生先验概率
男生错误个数
女生错误个数
总错误
男生错误率
女生错误率
总错误率
Parzen窗法
0.25
0.75
7
22
29
14%
8.8%
9.67%
0.5
0.5
38
2
40
15.2%
4%
13.33%
0.75
0.25
2
46
48
18.4%
4%
16%
最大似然Bayes
0.25
0.75
8
6
14
3.2%
12%
4.67%
0.5
0.5
29
3
32
11.6%
6%
10.67%
0.75
0.2
59
1
60
23.6%
2%
20%
分析:
通过比较可知,在用最大似然估计这种参数估计方法和Parzen这种非参数估计方法来进行分类时,最大似然估计判别的错误率低。
dvzfvkwMI1
2、得到结果如下
<1)、用Fisher线性判别方法求分类器,将分类器应用到训练和测试样本上,比较其错误率
判别
对象
男生错误个数
女生错误个数
总错误
男生错误率
女生错误率
总错误率
测试样本
27
2
29
10.8%
4%
9.67%
训练样本
8
4
12
16%
8%
12%
分析:
用训练样本得到的分类器测试测试样本时错误率低,测试结果较好,但测试训练样本时,其错误率较高,测试结果不好。
rqyn14ZNXI
<2)、将训练样本和求得的决策边界画到图上
先验概略为0.5,0.5
从图中我们可以直观的比较出对训练样本Fisher判别比最大似然Bayes判别效果更好。
3、留一法测试结果如下:
判别
对象
男生错误个数
女生错误个数
错误率
测试样本
81
3
28%
训练样本
8
4
12%
分析:
用留一法在训练样本机上估计错误率时,错误率小于它在测试样本集上得到的错误率,且留一法在测试样本集上女生错误个数远低于男生错误个数。
EmxvxOtOco
五、体会
这次实验,我们组用了接近三天的时间,首先,我们对题目要求进行认真分析,在确保对题目完全理解的基础上,开始一步一步分析,求解。
对每个小题,及其每一问,我们都经过查书,查资料,编代码这几个步骤,仔细分析每一步算法,得出流程图。
经过第一次作业的编程,本次编程我们都觉得轻松了很多,但还会出现一些细节上的错误,不过,这些在我们经过不断的调试之后都会被发现并解决。
总体而言,本次实验,让我们对Parzen窗法求类条件概率密度,以及Fisher线性判别法都有了更大的了解。
SixE2yXPq5
代码:
%特征是身高,先验概率为0.5、0.5时用Parzen窗法,贝叶斯分类器。
clc。
clearall。
[FHFW]=textread('C:
\Users\xuyd\Desktop\homework\FEMALE.txt','%f%f'>。
6ewMyirQFL
[MHMW]=textread('C:
\Users\xuyd\Desktop\homework\MALE.txt','%f%f'>。
kavU42VRUs
FA=[FHFW]。
MA=[MHMW]。
N1=max(size(FA>>。
h1=4。
hn1=h1/(sqrt(N1>>。
VN1=h1/(sqrt(N1>>。
N2=max(size(MA>>。
h2=4。
hn2=h2/(sqrt(N2>>。
VN2=h2/(sqrt(N2>>。
[tHtW]=textread('C:
\Users\xuyd\Desktop\homework\test2.txt','%f%f%*s'>。
y6v3ALoS89
X=[tHtW]。
[MN]=size(X>。
s=zeros(M,1>。
A=[X(:
1>X(:
2>s]。
error=0。
errorgirl=0。
errorboy=0。
errorrate=0。
errorgirlrate=0。
errorboyrate=0。
girl=0。
boy=0。
bad=0。
fork=1:
M%测试集
x=A(k>。
p=0.5。
%p为属于女生的先验概率,则1-p为男生的先验概率
fori=1:
N1
pp(i>=1/sqrt(2*pi>*exp(-0.5*(abs(x-FA(i>>>^2/(hn1^2>>。
%pp
end
p1=sum(1/VN1*pp'>。
y1=1/N1*p1。
%是女生的条件概率密度函数
forj=1:
N2
qq(j>=1/sqrt(2*pi>*exp(-0.5*(abs(x-MA(j>>>^2/(hn2^2>>。
0YujCfmUCw
end
q1=sum(1/VN2*qq'>。
y2=1/N2*q1。
%男生的概率密度函数,即其条件概率
g=p*y1-(1-p>*y2。
%g为判别函数
ifg>0
ifk<=50
s(k,1>=0。
%判为女生
girl=girl+1。
else
errorboy=errorboy+1。
end
elseifg<0
ifk<=50
errorgirl=errorgirl+1。
else
s(k,1>=1。
%判为男生
boy=boy+1。
end
else
s(k,1>=-2。
%不能判别是指等于0时的情况
bad=bad+1。
end
end
errorgirl
errorboy
bad
girl=errorboy+girl
boy=boy+errorgirl
error=errorgirl+errorboy
errorgirlrate=errorgirl/50
errorboyrate=errorboy/250
errorrate=error/M
%特征是身高与体重,先验概率为0.5、0.5时用Parzen窗法,贝叶斯分类器。
clc。
clearall。
[FHFW]=textread('C:
\Users\xuyd\Desktop\homework\FEMALE.txt','%f%f'>。
eUts8ZQVRd
[MHMW]=textread('C:
\Users\xuyd\Desktop\homework\MALE.txt','%f%f'>。
sQsAEJkW5T
FA=[FHFW]。
MA=[MHMW]。
N1=max(size(FA>>。
h1=7。
hn1=h1/(sqrt(N1>>。
VN1=hn1^2。
N2=max(size(MA>>。
h2=7。
hn2=h2/(sqrt(N2>>。
VN2=hn2^2。
[tHtW]=textread('C:
\Users\xuyd\Desktop\homework\test2.txt','%f%f%*s'>。
GMsIasNXkA
X=[tHtW]。
[MN]=size(X>。
s=zeros(M,1>。
error=0。
errorgirl=0。
errorboy=0。
errorrate=0。
errorgirlrate=0。
errorboyrate=0。
girl=0。
boy=0。
bad=0。
fork=1:
M
A=[X(k,1>X(k,2>]。
x=A。
p=0.5。
%p为属于女生的先验概率,则1-p为男生的先验概率
pp=0。
fori=1:
N1
fa=[FA(i,1>FA(i,2>]。
n=1/sqrt(2*pi>*exp(-0.5*abs((x-fa>*(x-fa>'>/(hn1^2>>。
TIrRGchYzg
pp=pp+n。
end
p1=1/VN1*pp'。
y1=1/N1*p1。
%是女生的条件概率密度函数
qq=0。
forj=1:
N2
ma=[MA(j,1>MA(j,2>]。
m=1/sqrt(2*pi>*exp(-0.5*abs((x-ma>*(x-ma>'>/(hn2^2>>。
7EqZcWLZNX
qq=m+qq。
end
q1=sum(1/VN2*qq'>。
y2=1/N2*q1。
%男生的概率密度函数,即其条件概率
g=p*y1-(1-p>*y2。
%g为判别函数
ifg>0
ifk<=50
s(k,1>=0。
%判为女生
girl=girl+1。
else
errorboy=errorboy+1。
end
elseifg<0
ifk<=50
errorgirl=errorgirl+1。
else
s(k,1>=1。
%判为男生
boy=boy+1。
end
else
s(k,1>=-2。
%不能判别是指等于0时的情况
bad=bad+1。
end
end
errorgirl
errorboy
bad
girl=errorboy+girl
boy=boy+errorgirl
error=errorgirl+errorboy
errorgirlrate=errorgirl/50
errorboyrate=errorboy/250
errorrate=error/M
%用fisher线性判别法求阈值
function[w,y0]=fisher(AA,BB>
A=AA'。
B=BB'。
[k1,l1]=size(A>。
[k2,l2]=size(B>。
M1=sum(AA>。
M1=M1'。
M1=M1/l1。
%男生均值向量
M2=sum(BB>。
M2=M2'。
M2=M2/l2。
%女生均值向量
S1=zeros(k1,k1>。
%建立矩阵
S2=zeros(k2,k2>。
fori=1:
l1
S1=S1+(A(:
i>-M1>*((A(:
i>-M1>.'>。
%男生的类内离散度矩阵
end
fori=1:
l2
S2=S2+(B(:
i>-M2>*((B(:
i>-M2>.'>。
%女生的类内离散度矩阵
end
Sw=0.5*S1+0.5*S2。
%总类内离散度矩阵,先验概率0.5
w=inv(Sw>*(M1-M2>。
%两列
wT=w'。
%wT就是使Fisher准则函数JFfori=1:
l1
Y1(i>=wT(1,1>*A(1,i>+wT(1,2>*A(2,i>。
%求出二维男生样本集映射到一维时的量zvpgeqJ1hk
end
fori=1:
l2
Y2(i>=wT(1,1>*B(1,i>+wT(1,2>*B(2,i>。
%求出二维女生样本集映射到一维时的量NrpoJac3v1
end
m1=sum(Y1>/l1。
m2=sum(Y2>/l2。
y0=(l1*m1+l2*m2>/(l1+l2>。
%
%用fisher线性判别函数来判断
clc
clearall
[filename,pathname,filterindex]=uigetfile('*.txt','请读入男生训练集'>。
1nowfTG4KI
fileAddrs=[pathname,filename]。
[A1A2]=textread(fileAddrs,'%f%f'>。
[filename,pathname,filterindex]=uigetfile('*.txt','请读入女生训练集'>。
fjnFLDa5Zo
fileAddrs=[pathname,filename]。
[B1B2]=textread(fileAddrs,'%f%f'>。
AA=[A1A2]。
BB=[B1B2]。
[w,y0]=fisher(AA,BB>。
wT=w'。
girl=0。
boy=0。
bad=0。
errorgirl=0。
errorboy=0。
error=0。
errorgirlrate=0。
errorboyrate=0。
errorrate=0。
[filename,pathname,filterindex]=uigetfile('*.txt','请读入测试集'>。
tfnNhnE6e5
fileAddrs=[pathname,filename]。
[T1T2]=textread(fileAddrs,'%f%f%*s'>。
TT=[T1T2]。
T=TT'。
[k3l3]=size(T>。
fork=1:
50
y(k>=wT*T(:
k>。
ify(k>>y0
errorgirl=errorgirl+1。
elseify(k>girl=girl+1。
else
bad=bad+1。
end
end
end
fork=51:
300
y(k>=wT*T(:
k>。
ify(k>>y0
boy=boy+1。
elseify(k>errorboy=errorboy+1。
else
bad=bad+1。
end
end
end
errorgirl
errorboy
bad
girl=errorboy+girl
boy=boy+errorgirl
error=errorgirl+errorboy
errorgirlrate=errorgirl/50
errorboyrate=errorboy/250
errorrate=error/l3
%画图
[filename,pathname,filterindex]=uigetfile('*.txt','请读入男生训练集'>。
HbmVN777sL
fileAddrs=[pathname,filename]。
[A1A2]=textread(fileAddrs,'%f%f'>。
[filename,pathname,filterindex]=uigetfile('*.txt','请读入女生训练集'>。
V7l4jRB8Hs
fileAddrs=[pathname,filename]。
[B1B2]=textread(fileAddrs,'%f%f'>。
AA=[A1A2]。
BB=[B1B2]。
A=AA'。
B=BB'。
[k1,l1]=size(A>。
[k2,l2]=size(B>。
[w,y0]=fisher(AA,BB>。
fori=1:
l1
x=A(1,i>。
y=A(2,i>。
%x是身高,y是体重
plot(x,y,'R.'>。
holdon
end
fori=1:
l2
x=B(1,i>。
y=B(2,i>。
plot(x,y,'G.'>。
holdon
end
a1=min(A(1,:
>>。
%男生身高最小值
a2=max(A(1,:
>>。
%男生身高最大值
b1=min(B(1,:
>>。
%女生身高最小值
b2=max(B(1,:
>>。
%女生身高最大值
a3=min(A(2,:
>>。
%男生体重最小值
a4=max(A(2,:
>>。
%男生体重最大值
b3=min(B(2,:
>>。
%女生体重最小值
b4=max(B(2,:
>>。
%女生体重最大值
ifa1a=a1。
else
a=b1。
%a是所有人中身高最小值
end
ifa2>b2
b=a2。
else
b=b2。
%b是所有人中身高最大值
end
ifa3c=a3。
else
c=b3。
%c是所有人中体重最小值
end
ifa4>b4
d=a4。
else
d=b4。
%d为所有人中体重最大值
end
x=a:
0.01:
b。
y=(y0-x*w(1,1>>/w(2,1>。
plot(x,y,'B'>。
holdon。
%身高体重相关,判别测试样本
%手动先验概率
P1=0.5。
P2=0.5。
FA=A。
MA=B。
a=cov(FA'>*(length(FA>-1>/length(FA>。
b=cov(MA'>*(length(MA>-1>/length(MA>。
W1=-1/2*inv(a>。
W2=-1/2*inv(b>。
Ave1=(sum(FA'>/length(FA>>'。
Ave2=(sum(MA'>/length(MA>>'。
w1=inv(a>*Ave1。
w2=inv(b>*Ave2。
w10=-1/2*Ave1'*inv(a>*Ave1-1/2*log(det(a>>+log(P1>。
83lcPA59W9
w20=-1/2*Ave2'*inv(b>*Ave2-1/2*log(det(b>>+log(P2>。
mZkklkzaaP
symsx。
symsy。
h=[xy]'。
h1=h'*W1*h+w1'*h+w10。
h2=h'*W2*h+w2'*h+w20。
h=h1-h2。
ezplot(h,[130,200,30,100]>
%功能:
应用Fisher准则判断一个身高体重二维数据的性别
vector=[x。
y]。
yy=(w.'>*vector。
ifyy>y0
value=2。
%表示样本是男生
else
value=1。
%表示样本是女生
end
%功能:
使用留一法求训练样本错误率
[A1A2]=textread('C:
\Users\Administrator\Desktop\模式识别\homework\MALE.txt','%f%f'>。
AVktR43bpw
[B1B2]=textread('C:
\Users\Administrator\Desktop\模式识别\homework\FEMALE.txt','%f%f'>。
ORjBnOwcEd
AA=[A1A2]。
BB=[B1B2]。
A=AA'。
B=BB'。
m1=2。
m2=2。
n1=50。
n2=50。
tempA=zeros(m1,n1-1>。
count=0。
fori=1:
n1
forj=1:
(i-1>
tempA(:
j>=A(:
j>。
end
forj=(i+1>:
n1
tempA(:
j-1>=A(:
j>。
end
[w,y0]=fisher((tempA.'>,BB>。
flag=classify_CH(A(1,i>,A(2,i>,w,y0>。
ifflag==1
count=count+1。
end
end
tempB=zeros(m2,n2-1>。
fori=1:
n2
forj=1:
(i-1>
tempB(:
j>=B(:
j>。
end
forj=(i+1>:
n2
tempB(:
j-1>=B(:
j>。
end
[w,y0]=fisher(AA,(tempB.'>>。
flag=classify_CH(B(1,i>,B(2,i>,w,y0>。
ifflag==2
count=count+1。
end
end
error_ratio=count/(n1+n2>
%使用留一法求测试样本