位势函数法解决非线性模式识别问题

用势函数的概念来确定判别函数和划分类别界面。

一、基本思想

  假设要划分属于两种类别ω1和ω2的模式样本,这些样本可看成是分布在n维模式空间中的点xk。

  把属于ω1的点比拟为某种能源点,在点上,电位达到峰值。

  随着与该点距离的增大,电位分布迅速减小,即把样本xk附近空间x点上的电位分布,看成是一个势函数K(x, xk)。

  对于属于ω1的样本集群,其附近空间会形成一个“高地”,这些样本点所处的位置就是“山头”。

  同理,用电位的几何分布来看待属于ω2的模式样本,在其附近空间就形成“凹地”。

  只要在两类电位分布之间选择合适的等高线,就可以认为是模式分类的判别函数。

二、 判别函数的产生

  模式分类的判别函数可由分布在模式空间中的许多样本向量{xk, k=1,2,…且 

}的势函数产生。

  任意一个样本所产生的势函数以K(x, xk)表征,则判别函数d(x)可由势函数序列K(x, x1), K(x, x2),…来构成,序列中的这些势函数相应于在训练过程中输入机器的训练模式样本x1,x2,…。

  在训练状态,模式样本逐个输入分类器,分类器就连续计算相应的势函数,在第k步迭代时的积累位势决定于在该步前所有的单独势函数的累加。

  以K(x)表示积累位势函数,若加入的训练样本xk+1是错误分类,则积累函数需要修改,若是正确分类,则不变。 

  从势函数可以看出,积累位势起着判别函数的作用 当xk+1属于ω1时,Kk(xk+1)>0;当xk+1属于ω2时,Kk(xk+1)<0,则积累位势不做任何修改就可用作判别函数。

  由于一个模式样本的错误分类可造成积累位势在训练时的变化,因此势函数算法提供了确定ω1和ω2两类判别函数的迭代过程。

三、势函数的选择

选择势函数的条件:一般来说,若两个n维向量x和xk的函数K(x, xk)同时满足下列三个条件,则可作为势函数。

  (1)K(x, xk)= K(xk, x),并且当且仅当x=xk时达到最大值;

  (2)当向量x与xk的距离趋于无穷时,K(x, xk)趋于零;

  (3)K(x, xk)是光滑函数,且是x与xk之间距离的单调下降函数。

四、实例

已知两类训练样本:
w1:(1,1),(2,1)
w2:(-1,-1),-2,-1)
采用位势函数法编程实现分类器设计(要求分析判决界面)

下面分别采用两种位势函数进行仿真

分别是二类函数中的(a) 和(b)

#在自己的代码使用过程中需要改掉x_1和x_2的列表数值就可以来进行使用 

import matplotlib.pyplot as plt
import sympy as sym
from sympy.plotting import plot_implicit 

x_1=[[1,1],[2,1]]
x_2=[[-1,-1],[-2,-1]]

p=1#代表符号变量
x1,x2=sym.symbols("x1:3")#未知数x1和x2
r=0*x1+0*x2#用来保证第一步计算的时候有数值未知数的值可以放进去且为0相当于强制进行了0 
      
while p==1:
    p=0
    for i in range(len(x_1)):
        t=r.evalf(subs = {x1:x_1[i][0],x2:x_1[i][1]})
        if t<=0:
            r=r+sym.exp(-((x1-x_1[i][0])**2+(x2-x_1[i][1])**2)) # 位势函数(1)
            # r = r+1/(1+((x1-x_1[i][0])**2+(x2-x_1[i][1])**2)) # 位势函数(2)
            p=1
    for i in range(len(x_2)):
        t=r.evalf(subs = {x1:x_2[i][0],x2:x_2[i][1]})
        if t>=0:
            r=r-sym.exp(-((x1-x_2[i][0])**2+(x2-x_2[i][1])**2))
            # r = r-1/(1+((x1-x_2[i][0])**2+(x2-x_2[i][1])**2))
            p=1
r
print(r)
plot_implicit(r, (x1, -3, 3), (x2, -3, 3))  
# 设置图形标题和坐标轴标签  
plt.title('Decision interface')  
plt.xlabel('x1')  
plt.ylabel('x2')  
for i in range(len(x_1)):
    plt.scatter(x_1[i][0],x_1[i][1],color=plt.cm.Set1(0))
    plt.scatter(x_2[i][0],x_2[i][1],color=plt.cm.Set1(1))
# 显示图形  
plt.show()

(a)函数的结果

(b)函数的结果

        

        

  • 40
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值