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

前言

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

实验目的

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

实验原理

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

知识补充

Ⅱ型势函数:直接选择双变量X和Xk的对称函数作为势函数,即:K(X,Xk)=K(Xk,X)
如:在这里插入图片描述

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

在这里插入图片描述
当α取1的时候:
K(X,Xk)=exp{-||X-Xk||2}=exp{-[(X1-Xk1)2+(X2-Xk2)2]}

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

例题说明

在这里插入图片描述

代码实现

#在自己的代码使用过程中需要改掉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代码示例:
在这里插入图片描述
在这里插入图片描述

程序运行结果:
在这里插入图片描述

数学迭代步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

改写过程学到的知识

  • 自己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))绘图函数的学习
    在这里插入图片描述
    这个是plt.cm.Set1()的八个对应数值颜色的图示,超过序号8的那么就默认为最后的黑色

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值