模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

前言

在学校的深度学习实验过程中,由于要求实现非线性分类器的势函数实验中给出的例程代码是matlab语言的(ps:自从电脑被偷了以后,新电脑没有装matlab),我便想到用python实现非线性分类器的代码实现。载刚刚开始写遇到小困惑的时候,在网上中文社区查找代码实现的过程中发现都是一些介绍势函数法的原理和matlab代码实现的,没有一个完整的势函数原理+python代码实现的博客。本来以为是很简单的移植过程,发现python中没有像matlab一样可以直接计算表达式的函数,也没有可以进行指数运算的函数,便用来一个下午加+半个早上进行新知识的边学习边实践,尝试将代码进行复刻转换出来。

实验目的

(1)了解非线性可分的概念。
(2)掌握利用势函数法设计非线性分类器的方法。

实验原理

模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

原理图示来自西安邮电大学模式识别实验课教案

知识补充

Ⅱ型势函数:直接选择双变量X和Xk的对称函数作为势函数,即:K(X,Xk)=K(Xk,X)
如:模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

我们本次实验使用的是3-66算子来进行实验

模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
当α取1的时候:
K(X,Xk)=exp{-||X-Xk||2}=exp{-[(X1-Xk1)2+(X2-Xk2)2]}

二型势函数的特点: 当训练样本的维数和数目较高时,需要计算和存储更多的指数项,但正因为判别函数由许多新项组成,故有很强的分类能力。

例题说明

模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

代码实现

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

import matplotlib.pyplot as plt
import math
import sympy as sym
# def shihanshu(k,n,q):
#     return k.evalf(subs = {x1:n,x2:p})
x_1=[[0,0],[2,0]]
x_2=[[1,1],[1,-1]]
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))
p=1#代表符号变量
x1,x2=sym.symbols("x1:3")#未知数x1和x2
r=0*x1+0*x2#用来保证第一步计算的时候有数值未知数的值可以放进去且为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))
            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))
            p=1
r

#在这一个实验中我反反复复的检查发现实验过程中在回调函数上面出现了问题,在进行函数回调时,当我们传入的未知参数
#每个如果只出现一次时也就是x,y只出现一次,后面没有再出现时计算的数值没有错误,如果出现超过一次时那么会导致函数的回调值与理想计算值不符合
        

另外再附上matlab代码示例:
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

程序运行结果:
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

数学迭代步骤

模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

综合数学迭代结果以及运算结果得到相同的结果,验证我们的程序设计正确

改写过程学到的知识

  • 自己debug能力的提升,不断根据错误数据调整,并且发现库文件的一个小bug

  • sympy数学表达式库函数的学习
    sym.exp():数学形式的指数函数表达式
    sym.evalf(subs = {x1:x_2[i][0],x2:x_2[i][1]}):数学上进行赋值的函数
    x1,x2=sym.symbols(“x1:3”)#未知数x1和x2

  • plt.scatter(x_1[i][0],x_1[i][1],color=plt.cm.Set1(0))绘图函数的学习
    模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现
    这个是plt.cm.Set1()的八个对应数值颜色的图示,超过序号8的那么就默认为最后的黑色

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年5月27日 下午4:13
下一篇 2022年5月27日

相关推荐