资讯详情

实验二 势函数算法

势函数主要用于确定分类面,其思想来自物理。

  • 假设属于两类ω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,

则有

  1. 若??2∈??1x2∈ω1且??1(??2)>0K1(x2)>0,或??2∈??2x2∈ω2.1(2)<0K1(x2)<0、分类正确,此时2()=??1(??)K2(x)=K1(x),即积累势函数不变。
  2. 若??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)

  3. 若??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|

  1. 选择合适的正交函数集{

选择Hermite多项式,其正交域为(-∞, +∞),其一维形式是 

其正交性:

其中,Hk(x)前面的乘式为正交归一化因子,为计算简便可省略。因此,Hermite多项式前面几项的表达式为 

H0(x)=1,        H1(x)=2x,        H2(x)=4x2-2, 

H3(x)=8x3-12x,        H4(x)=16x4-48x2+12 

  1. 建立二维的正交函数集 

二维的正交函数集可由任意一对一维的正交函数组成,这里取四项最低阶的二维的正交函数 

  1. 生成势函数 

按第一类势函数定义,得到势函数 

其中

  1. 通过训练样本逐步计算累积位势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

标签: rk093电位器rk0971110909电位器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台