势函数主要用于确定分类面,其思想来自物理。
- 假设属于两类ω1和??2ω这些样本可以看作是分布在2的模式样本n维模式空间中的点xk。
- 把属于??1ω1某一能源点相比,在点上,电位达到峰值。
- 随着与该点距离的增加,电位分布迅速减小,即样本xk附近空间附近近空间x点上的电位分布被视为势函数()K(x,xk)。
- 属于1ω1样本集群将在其附近的空间形成"高地",这些样本点的位置是"山头"。
- 同样,用电位的几何分布来看待属于2ω2模式样本在附近空间形成"凹地"。
- 在两种电位分布之间选择合适的等高线,可视为模式分类的判别函数。
- 模布在模式空间中的许多样本向量{,=1、2、和,∈??1∪??2}{xk,k=1,2,?且,xk∈ω1∪w产生2}的势函数。
- 任何样本产生的势函数都是?(??,????)K(x,xk)表征,判断函数?(??)d(x)势函数序列?(??,??1),??(??,??2),?K(x,x1),K(x,x2),?在训练过程中,序列中的这些训练过程中输入机器的训练模式样本?1,??2,?x1,x2,?。
- 在训练状态下,模式样本逐个输入分类器,分类器连续计算相应的势函数k步迭代时的积累位置决定了步前所有单独势函数的积累。
- ()K(x)表示积累位势函数,如果添加训练样本 1xk 1.如果分类错误,则需要修改积累函数。如果分类正确,则不变。
初始势函数0()=0K0(x)=0
第一步:添加第一个训练样本1x1,
则有
??1(??)=(1)(1)(1)if??1∈??1if??1∈??2K1(x)={K(x,x1)ifx1∈ω1?K(x,x1)ifx1∈ω2
积累势函数1()K1(x)描述了添加第一个样本时的边界划分。当样本属于1时ω当样本属于2时,势函数为正;ω2时,势函数为负。
第二步:添加第二个训练样本2x2,
则有
- 若??2∈??1x2∈ω1且??1(??2)>0K1(x2)>0,或??2∈??2x2∈ω2.1(2)<0K1(x2)<0、分类正确,此时2()=??1(??)K2(x)=K1(x),即积累势函数不变。
- 若??2∈??1x2∈ω1.12)<0K1(x——2)<0,则
??2(??)=??1(??) ??(2)=±??(1) ??(2)K2(x)=K1(x) K(x,x2)=±K(x,x1) K(x,x2)
- 若??2∈??2x2∈ω2.1(2)>0K1(x2)>0,则
??2(??)=??()(2)=±??(1)(2)K2(x)=K1(x)?K(x,x2)=±K(x,x1)?K(x,x2)
以上(ii)、(iii)两种情况属于错分。假如??2x2处于??1(??)K1(x)当定义边界的错误一面时?∈??1x∈ω1时,积累位势?2(??)K2(x)要加??(??,??2)K(x,x2),当??∈??2x∈ω2时,积累位势?2(??)K2(x)要减??(??,??2)K(x,x2)。
第??K步骤:设置()Kk(x)加入训练样本1,2,x1,x2,?,xk在积累位势之后,加入第( 1)(k 1)个样本时 1(??)Kk 1(x)决定如下:
1. 若???? 1∈??1xk 1∈ω1且????(???? 1)>0Kk(xk 1)>0,或???? 1∈??2xk 1∈ω2且????(???? 1)<0Kk(xk 1)<0.分类正确,此时???? 1(??)=????(??)Kk 1(x)=Kk(x),也就是说,积累位置不变。
2. 若??? 1∈??1xk 1∈ω1. 1)<0Kk(xk 1)<0,则??? 1(??)=???(??) ??(), 1)Kk 1(x)=Kk(x) K(x,xk 1);
3. 若??? 1∈??2xk 1∈ω2. 1)>0Kk(xk 1)>0,则??? 1(??)=???()() 1)Kk 1(x)=Kk(x)?K(x,xk 1).
因此,积累位置的迭代运算可以写成 1(??)=???(??) ??? 1.() 1)Kk 1(x)=Kk(x) rk 1K(x,xk 1)??? 1rk 1.校正系数:
???? 1=???????001?1???????? 1∈??1and????(???? 1)>0???????? 1∈??2and????(???? 1)<0???????? 1∈??1and????(???? 1)<0???????? 1∈??2and????(???? 1)>0rk 1={0ifxk 1∈ω1andKk(xk 1)>00ifxk 1∈ω2andKk(xk 1)<01ifxk 1∈ω1andKk(xk 1)<0?1ifxk 1∈ω2andKk(xk 1)>0
若从给定的训练样本集?1,??2,?,????,?x1,x2,?,xk,?去除不会改变积累位置的样本,即使???(???? 1)>0Kj(xj 1)>0且???? 1∈??1xj 1∈ω1,或????(???? 1)<0Kj(xj 1)<0且???? 1∈??2xj 1∈ω2的样本可以简化样本序列{??1,???2,…,?????,…}{x?1,x?2,…,x?j,…},它们完全是校正错误的样本。此时,上述迭代公式可概括为:
??? 1(??)=∑???(??,???)Kk 1(x)=∑x?jajK(x,x?j)
其中
???={ 1?1???∈??1???∈??2aj={ 1forx?j∈ω1?1forx?j∈ω2
也就是说,由 1k 一个训练样本产生的积累位置等于1ω1类和??2ω二类中校正错误样本的总位置差异。
从势函数可以看出,积累位势起着判断函数的作用:当??? 1xk 1属于??1ω1时,????(???? 1)>0Kk(xk 1)>0;当???? 1xk 1属于??2ω2时,????()???? 1<0Kk()xk 1<0.积累位势可作为判断函数,无需任何修改。
由于模式样本的错误分类会导致训练过程中积累位置的变化,因此确定了势函数算法?1ω1和??2ω二、二别函数的迭代过程。判别函数表达式:取?(??)=??(??)d(x)=K(x),则有:???? 1(??)=????(??) ???? 1??(??,???? 1)dk 1(x)=dk(x) rk 1K(x,xk 1).
第一类势函数和第二类势函数
:
可用对称的有限多项式展开,即:
??()=∑??=1.()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()())()()()())()()()()()()()()()()()()()()()()()()()()()()()()()())()()()()()()()()()()()()()()()()()()()()()()()()()()()()())()()()()()()()()()())())()())()())()())())()()())()())()()()))()))()))()())()()()))())))())))))()())())()))())()()()()()()()))()))()))()))()))()))))))))()()()()()()()())()))()()()()()()()))))))())))))))()()()())()))))()()()()()()()()))())()()()()()()))()))))()()()()()()))))))()))))))))))))))()))))))()()()()()())()()()()()))()()())())))))))))))))()))))()()()())()())))))))())))()()()()()()()K(x,xk)=∑i=1m?i(x)?i(xk)
其中{
}在模式定义域内为正交函数集。将这类势函数代入判别函数,有:
???? 1(??)=????(??) ???? 1∑??=1??????(???? 1)????(??)=????(??) ∑??=1?????? 1????(???? 1)????(??)dk 1(x)=dk(x) rk 1∑i=1m?i(xk 1)?i(x)=dk(x) ∑i=1mrk 1?i(xk 1)?i(x)
迭代关系:
??? 1(??)=∑??=1?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????(????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 1)()()dk 1(x)=∑i=1mCi(k 1)?i(x)
其中
???(?? 1)=???(??) ???+1𝜙𝑖(𝑥𝑘+1)Ci(k+1)=Ci(k)+rk+1ϕi(xk+1)
因此,积累位势可写成:
𝐾𝑘+1(𝑥)=∑𝑖=1𝑚𝐶𝑖(𝑘+1)𝜙𝑖(𝑥)Kk+1(x)=∑i=1mCi(k+1)ϕi(x)
$Ci$可用迭代式求得。
选择双变量𝑥x和$x_k$的对称函数作为势函数,即$K(x, x_k) = K(x_k, x)$,并且它可展开成无穷级数,例如:
(a) 𝐾(𝑥,𝑥𝑘)=𝑒−𝛼‖𝑥−𝑥𝑘‖2K(x,xk)=e−α‖x−xk‖2
(b) 𝐾(𝑥,𝑥𝑘)=11+𝛼‖𝑥−𝑥𝑘‖2K(x,xk)=11+α‖x−xk‖2, 𝛼α是正常数
(c) 𝐾(𝑥,𝑥𝑘)=∣∣∣sin𝛼‖𝑥−𝑥𝑘‖2𝛼‖𝑥−𝑥𝑘‖2∣∣∣K(x,xk)=|sinα‖x−xk‖2α‖x−xk‖2|
- 选择合适的正交函数集{ }
选择Hermite多项式,其正交域为(-∞, +∞),其一维形式是
其正交性:
其中,Hk(x)前面的乘式为正交归一化因子,为计算简便可省略。因此,Hermite多项式前面几项的表达式为
H0(x)=1, H1(x)=2x, H2(x)=4x2-2,
H3(x)=8x3-12x, H4(x)=16x4-48x2+12
- 建立二维的正交函数集
二维的正交函数集可由任意一对一维的正交函数组成,这里取四项最低阶的二维的正交函数
- 生成势函数
按第一类势函数定义,得到势函数
其中
,
- 通过训练样本逐步计算累积位势K(x)
给定训练样本:ω1类为x①=(1 0)T, x②=(0 -1)T
ω2类为x③=(-1 0)T, x④=(0 1)T
累积位势K(x)的迭代算法如下
第一步:取x①=(1 0)T∈ω1,故
K1(x)=K(x, x①)=1+4x1·1+4x2·0+16x1x2·1·0=1+4x1
第二步:取x②=(0 -1)T∈ω1,故K1(x②)=1+4·0=1
因K1(x②)>0且x②∈ω1,故K2(x)=K1(x)=1+4x1
第三步:取x③=(-1 0)T∈ω2,故K2(x③)=1+4·(-1)=-3
因K2(x③)<0且x③∈ω2,故K3(x)=K2(x)=1+4x1
第四步:取x④=(0 1)T∈ω2,故K3(x④)=1+4·0=1
因K3(x④)>0且x④∈ω2,
故K4(x)=K3(x)-K(x,x④)=1+4x1-(1+4x2)=4x1-4x2
将全部训练样本重复迭代一次,得
第五步:取x⑤=x①=(1 0)T∈ω1,K4(x⑤)=4
故K5(x)=K4(x)=4x1-4x2
第六步:取x⑥=x②=(0 -1)T∈ω1,K5(x⑥)=4
故K6(x)=K5(x)=4x1-4x2
第七步:取x⑦=x③=(-1 0)T∈ω2,K6(x⑦)=-4
故K7(x)=K6(x)=4x1-4x2
第八步:取x⑧=x④=(0 1)T∈ω2,K7(x⑧)=-4
故K8(x)=K7(x)=4x1-4x2
以上对全部训练样本都能正确分类,因此算法收敛于判别函数
d(x)= 4x1-4x2
选择指数型势函数,取α=1,在二维情况下势函数为
这里:ω1类为x①=(0 0)T, x②=(2 0)T
ω2类为x③=(1 1)T, x④=(1 -1)T
可以看出,这两类模式是线性不可分的。算法步骤如下:
第一步:取x①=(0 0)T∈ω1,则
K1(x)=K(x,x①)=
第二步:取x②=(2 0)T∈ω1
因K1(x②)=e-(4+0)=e-4>0,
故K2(x)=K1(x)=
第三步:取x③=(1 1)T∈ω2
因K2(x③)=e-(1+1)=e-2>0,
故K3(x)=K2(x)-K(x,x③)=
第四步:取x④=(1 -1)T∈ω2
因K3(x④) =e-(1+1)-e-(0+4)=e-2-e-4>0,
故K4(x)=K3(x)-K(x,x④)
=
需对全部训练样本重复迭代一次
第五步:取x⑤=x①=(0 0)T∈ω1,K4(x⑤)=e0-e-2-e-2=1-2e-2>0
故K5(x)=K4(x)
第六步:取x⑥=x②=(2 0)T∈ω1,K5(x⑥)=e-4-e-2-e-2=e-4-2e-2<0
故K6(x)=K5(x)+K(x,x⑥)
=
第七步:取x⑦=x③=(1 1)T∈ω2,K6(x⑦)=e-2-e0-e-4+e-2=2e-2-e-4-1<0
故K7(x)=K6(x)
第八步:取x⑧=x④=(1 -1)T∈ω2,K7(x⑧)=e-2-e-4-e0+e-2=2e-2-e-4-1<0
故K8(x)=K7(x)
第九步:取x⑨=x①=(0 0)T∈ω1,K8(x⑨)=e0-e-2-e-2+e-4=1+e-4-2e-2>0
故K9(x)=K8(x)
第十步:取x⑩=x②=(2 0)T∈ω1,K9(x⑩)=e-4-e-2-e-2+e0=1+e-4-2e-2>0
故K10(x)=K9(x)
经过上述迭代,全部模式都已正确分类,因此算法收敛于判别函数
1.用第二类势函数,当训练样本维数和数目都较高时,需要计算和存储的指数项较多。
2. 正因为势函数由许多新项组成,因此有很强的分类能力。
n=6; % n表示样本总数。这里n=6,前3个样本属于第一类,后三个样本属于第二类
m=30; % 判别函数最大的项数
d=3; % d表示维长
r=0; % r表示在判别函数中所具有的项数(每项是一个基函数,含3个坐标分量(维度=3))
tag=1; %判断是否继续循环的标志量
g=0;
% 样本
s=[ 1,2, 5,1
1,1, 2,1
3,3, 6,1
5,6,11,2
7,6,11,2
8,7,12,2]; % 第4列表示类别: 1表示属于第1类 % 2表示属于第2类
run=0; % run为轮次,初值置为0
while tag==1
run=run+1;
tag=0;
for k=1:n % n表示样本总数。
if r==0 % r==0表示判别函数还不含任何项时
r=r+1; %r指向到目前为止所得到的势函数的最后一项,此时准备含第一个项
% ftbl为结构数组,数组每个分量含index和symbol两个成分,分别记录样本号和符号
ftbl(r).symbol=1; % 该项的符号。 1--正;-1--负
ftbl(r).index=1; % 该项对应的样本下标号
continue;
else
g=0;
% 将当前的第k个样本先代入已建立的部分判别函数中进行计算,再判断分类是否正确
for i=1:r % i为扫描每一项的整数变量
temp=0;
for j=1:d % d表示维长。这里,d实际上为3,即d=3
temp=temp+(s(k,j)-s(ftbl(i).index,j))*(s(k,j)-s(ftbl(i).index,j));
end
g= g+ftbl(i).symbol*exp(-temp); %每项都是一指数形式,求出共r项的和
end
if ((g>0 &s(k,4)==1)||(g<0&s(k,4)==2))
continue; %正确分类时,不修改判别函数
else % 当前样本要构成一项保存到判别表达式中
tag=1;
r=r+1;
ftbl(r).index=k;
if(g>0& s(k,4)==2)
ftbl(r).symbol=-1;
else if(g<0&s(k,4)==1)
ftbl(r).symbol=1;
end
end
end
end
end
end
fprintf('所循环的轮次= %d',run);
fprintf('\n输出判别函数的表达式:\n');
% 输出判别函数,即输出判别函数的每一项。通过输出结构数组ftbl中的每一分量
for i=1:r
% 输出第i项
if(ftbl(i).symbol==1)
if i==1
fprintf('exp{-[(x1')
else
fprintf('+exp{-[(x1')
end
else
fprintf('-exp{-[(x1');
end
% 样本的第一个分量是正号,还是负号,决定输出分量数值前的符号
if (s(ftbl(i).index,1)>0) % 样本的第一个分量是正号
fprintf('-')
fprintf('%d',s(ftbl(i).index,1))
fprintf(')^2+(x2')
else if(s(ftbl(i).index,1)<0) % 样本的第一个分量是负号
fprintf('+')
fprintf('%d',-s(ftbl(i).index,1)) % 负负得正
fprintf(')^2+(x2');
else %s(ftbl(i).index,1)==0
fprintf(')^2+(x2');
end
end
if (s(ftbl(i).index,2)>0)
fprintf('-')
fprintf('%d',s(ftbl(i).index,2))
fprintf(')^2+(x3')
else if(s(ftbl(i).index,2)<0)
fprintf('+')
fprintf('%d',-s(ftbl(i).index,2))
fprintf(')^2+(x3');
else
fprintf(')^2+(x3')
end
end
if (s(ftbl(i).index,3)>0)
fprintf('-')
fprintf('%d',s(ftbl(i).index,3))
fprintf(')^2]}');
else
if(s(ftbl(i).index,3)<0)
fprintf('+')
fprintf('%d',-s(ftbl(i).index,3))
fprintf(')^2]}');
else
fprintf(')^2]}')
end
end
end
fprintf('\n')
% 判别每一样本的类别:
fprintf('判别每一样本的类别:\n');
for k=1:n;
g=0;
for i=1:r
temp=0;
for j=1:d %d表示维长
temp=temp+(s(k,j)-s(ftbl(i).index,j))*(s(k,j)-s(ftbl(i).index,j));
end
g=g+ftbl(i).symbol*exp(-temp); %共r项,每项都是一指数形式
end
if (g>0)
fprintf('第')
fprintf('%d',k)
fprintf('个样本的类别为: ')
fprintf('%d\n',1)
else if (g<0)
fprintf('第')
fprintf('%d',k)
fprintf('个样本的类别为: ')
fprintf('%d\n',2)
else %g==1
fprintf('第')
fprintf('%d',k)
fprintf('个样本的类别无法判别! ')
fprintf('但第')
fprintf('%d',k)
fprintf('个样本的实际类别为: ')
fprintf('%d\n',s(k,4));%输出实际类别
end
end
end
% cout<<endl;
%判断(2,3,5),(6,7,11)分别所属的类别:
%先对第一个样本,即(2,3,5)
a=[2,3,5];
g=0;
for i=1:r
temp=0;
for j=1:d %d表示维长
temp=temp+(a(j)-s(ftbl(i).index,j))*(a(j)-s(ftbl(i).index,j));
end
g=g+ftbl(i).symbol*exp(-temp); %共r项,每项都是一指数形式
end
if g>0
fprintf('样本a=(2,3,5)的类别为: ')
fprintf('%d\n',1)
else
if (g<0)
fprintf('样本a=(2,3,5)的类别为: ')
fprintf('%d\n',2)
else
fprintf('样本a=(2,3,5)的类别无法判别!\n')
end
end
%现对第二个样本,即(6,7,11)
b=[6,7,11];
g=0;
for i=1:r
temp=0;
for j=1:d % d表示维长
temp=temp+(b(j)-s(ftbl(i).index,j))*(b(j)-s(ftbl(i).index,j));
end
g=g+ftbl(i).symbol*exp(-temp); %共r项,每项都是一指数形式
end
if g>0
fprintf('样本b=(6,7,11)的类别为: ')
fprintf('%d\n',1)
else
if (g<0)
fprintf('样本b=(6,7,11)的类别为: ')
fprintf('%d\n',2)
else
fprintf('样本b=(6,7,11)的类别无法判别!\n')
end
end
fprintf('\n')
%%%%
%%%
function g=calfun(s,ftbl,r)
% s存放样本;ftbl存放样本号和符号;r为项数
g=1;
for i=1:r
temp=1;
for j=1:d % d表示维长
temp= temp+(s(k,j)-s(ftbl(i).index,j))*(s(k,j)-s(ftbl(i).index,j));
g= g+ftbl(i).symbol*exp(-temp); %共r项,每项都是一指数形式
end
end
end