首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >累积势函数分类

累积势函数分类

作者头像
不去幼儿园
发布2024-12-03 13:01:02
发布2024-12-03 13:01:02
16500
代码可运行
举报
文章被收录于专栏:强化学习专栏强化学习专栏
运行总次数:0
代码可运行

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记: AI学习笔记(17)---《累积势函数分类》

累积势函数分类

1.前言

理解并掌握势函数的数学定义和物理含义,并根据要求实现一个势函数。

理解并掌握累计势函数判别法的基本思想以及算法步骤,并根据要求实现一个势函数。

2.相关知识

2.1势函数的数学定义

定义点 Xk​ 处的势函数 K(.,X_k),它应满足:

2.2势函数的物理含义

势函数可以用来描述空间中一个点电荷的电势分布。

这个电荷在空间中所处的位置即为 Xk​ 所描述的位置。距离该点电荷距离测度越近,则电势越高;距离越远,则电势越低,并且电势随距离的变化是连续的。当距离该点电荷距离无限远时,电势趋近于 0,且不会为负(相对于正电荷来说)。

空间中点电荷电势分布特征正好符合前面所定义的势函数的一些特性。这也是势函数的一项物理含义。

2.3势函数构成方法

有两种构造势函数的方法,其中第一类方法是用对称的有限多项式展开,即:

第二类方法是直接选择双变量的对称函数作为势函数,例如:


3.累积势函数分类算法原理

3.1基本思想

势函数分类法是将二分类问题中的样本点看做正负电荷,并将他们的势函数叠加起来构成判别函数,即位势为 0 的判决界面。其基本思想如下:

  • 假设要划分属于两种类别 ω1​ω2​ 的模式样本,这些样本可以看成是分布在 n 维模式空间中的点 Xk​
  • 把属于 ω1​ 的点比拟为正电荷,势函数为正,相对地把属于 ω2​ 的点比拟为负电荷,势函数为负;
  • 将所有电荷的势函数叠加起来作为所有样本点的累积电势分布,只要在两类电势分布之间选择合适等势线,就可以认为是模式分类的判别函数。
3.2判别函数的产生

从势函数可以看出,累计位势起着判别函数的作用。

对于一个新的样本 Xk+1​ 以及前 k 个样本所构成的累计势函数 Kk​(X)

  • Xk+1​∈ω1​ 时, Kk​(Xk+1​)>0,或者当 Xk+1​∈ω2​时,Kk​(Xk+1​)<0,判别正确,累计势函数不用做任何修改;
  • 否则,需要对累计势函数进行修改,使其能对 Xk+1​ 正确判别。

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

3.3算法步骤
  • 第一步,初始化。令特征空间中个点处的累计位势函数 K0​(X)=0,判错计数 m=0
  • 第二步,令 j=0,加入第一个样本模式 X1​,得到以下位势函数:
  • 第三步,令 j=j+1,加入下一个样本模式 Xj​,计算累积势函数 Kj​(X)=Kj−1​(X)+αj​K(X,Xj​),累积位势函数的调整规则为:
  • 第四步,若 j<N,返至第三步。若 j=N,检查是否有模式错判;若 m=0,则结束,判别函数为 Kj​(X);若 m>0,令 j=0,m=0,返至第三步。

4.编程实现

4.1势函数MATLAB代码
代码语言:javascript
代码运行次数:0
运行
复制
function [result] = potential(X, Xk)
    result = exp(-norm(X - Xk, 2)); % 计算核函数值
end
4.2 累计势函数判别算法MATLAB代码
代码语言:javascript
代码运行次数:0
运行
复制
function [K, alpha] = step2_mission(samples, labels)
    m = 0; count = 1; N = size(samples, 1); % 初始化变量和样本数量
    j = 1; % 初始化样本索引
    K = samples(1, :); % 初始化支持向量
    alpha = labels(1); % 初始化alpha值
    
    while 1
        j = j + 1; 
        X = samples(j, :); % 当前样本
        k = 0;
        
        % 计算支持向量与当前样本的核函数值之和
        for i = 1:size(K, 1)
            k = k + alpha(i) * potential(X, K(i, :));
        end
        
        a = 0; % 初始化alpha调整值
        
        % 根据当前样本的标签和核函数值调整alpha值
        if labels(j) == 1 && k <= 0
            a = 1;
        elseif labels(j) == -1 && k >= 0
            a = -1;
        end
        
        m = m + abs(a); % 累加alpha调整值的绝对值
        
        if a ~= 0
            count = count + 1; % 更新支持向量计数
            alpha(count) = a; % 添加新的alpha值
            K = [K; X]; % 添加新的支持向量
        end
        
        if j == N % 遍历完所有样本
            if m == 0
                break; % 如果没有更新,结束循环
            else
                j = 0; m = 0; % 重置样本索引和更新计数
            end
        end
    end
end

function [result] = potential(X, Xk)
    result = exp(-norm(X - Xk, 2)); % 计算核函数值
end
4.3 测试输入

MATLAB终端输入下面指令

测试potential(X, Xk)

代码语言:javascript
代码运行次数:0
运行
复制
alpha = 2;

disp('task');
center = [0 0 0];
x1 = [1 1 1];
x2 = [0 0 0];
x3 = [0 1 1];
r1 = step1_mission(x1,center,alpha);
r2 = step1_mission(x2,center,alpha);
r3 = step1_mission(x3,center,alpha);
r4 = step1_mission(center,x3,alpha);
if 1 - r2 < 0.00001
    disp('max on center');
end
if r2 > r1
    disp('decrease by distance');
end
if r3 - r4 < 0.00001
    disp('commutativity');
end

测试step2_mission(samples, labels)

代码语言:javascript
代码运行次数:0
运行
复制
samples = [-7.82 -4.58 -3.97; -6.68 3.16 2.71; 4.36 -2.91 2.09; 6.72 0.88 2.80; -8.64 3.06 3.50; -6.87 0.57 -5.45; 4.47 -2.62 5.76; 6.73 -2.01 4.18; -7.71 2.34 -6.33; -6.91 -0.49 -5.68; 6.18 2.81 5.82; 6.72 -0.93 -4.04; -6.25 -0.26 0.56; -6.94 -1.22 1.13; 8.09 0.20 2.25; 6.81 0.17 -4.15; -5.19 4.24 4.04; -6.38 -1.74 1.43; 4.08 1.30 5.33; 6.27 0.93 -2.78];
labels = [-1.0000    1.0000    1.0000    1.0000   -1.0000   -1.0000    1.0000    1.0000   -1.0000   -1.0000    1.0000    1.0000   -1.0000   -1.0000    1.0000    1.0000    1.0000   -1.0000    1.0000    1.0000];

s = samples(1:5,:);
l = labels(1:5);
disp('task1');
disp('K')
disp('alpha')
[k, alpha] = step2_mission(s,l)

s = samples(1:10,:);
l = labels(1:10);
disp('task2');
disp('K')
disp('alpha');
[k, alpha] = step2_mission(s,l)

s = samples(1:20,:);
l = labels(1:20);
disp('task3');
disp('K')
disp('alpha');
[k, alpha] = step2_mission(s,l)

s = samples(1:20,1:2);
l = labels(1:20);
disp('task4');
disp('K')
disp('alpha');
[k, alpha] = step2_mission(s,l)

文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 累积势函数分类
    • 1.前言
    • 2.相关知识
      • 2.1势函数的数学定义
      • 2.2势函数的物理含义
      • 2.3势函数构成方法
    • 3.累积势函数分类算法原理
      • 3.1基本思想
      • 3.2判别函数的产生
      • 3.3算法步骤
    • 4.编程实现
      • 4.1势函数MATLAB代码
      • 4.2 累计势函数判别算法MATLAB代码
      • 4.3 测试输入
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档