本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记:
AI学习笔记(17)---《累积势函数分类》
累积势函数分类
目录
1.前言
2.相关知识
2.1势函数的数学定义
2.2势函数的物理含义
2.3势函数构成方法
3.累积势函数分类算法原理
3.1基本思想
3.2判别函数的产生
3.3算法步骤
4.编程实现
4.1势函数MATLAB代码
4.2 累计势函数判别算法MATLAB代码
4.3 测试输入
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)+αjK(X,Xj)
,累积位势函数的调整规则为:
- 第四步,若
j<N
,返至第三步。若j=N
,检查是否有模式错判;若m=0
,则结束,判别函数为Kj(X)
;若m>0
,令j=0,m=0
,返至第三步。
4.编程实现
4.1势函数MATLAB代码
function [result] = potential(X, Xk)result = exp(-norm(X - Xk, 2)); % 计算核函数值
end
4.2 累计势函数判别算法MATLAB代码
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 1j = j + 1; X = samples(j, :); % 当前样本k = 0;% 计算支持向量与当前样本的核函数值之和for i = 1:size(K, 1)k = k + alpha(i) * potential(X, K(i, :));enda = 0; % 初始化alpha调整值% 根据当前样本的标签和核函数值调整alpha值if labels(j) == 1 && k <= 0a = 1;elseif labels(j) == -1 && k >= 0a = -1;endm = m + abs(a); % 累加alpha调整值的绝对值if a ~= 0count = count + 1; % 更新支持向量计数alpha(count) = a; % 添加新的alpha值K = [K; X]; % 添加新的支持向量endif j == N % 遍历完所有样本if m == 0break; % 如果没有更新,结束循环elsej = 0; m = 0; % 重置样本索引和更新计数endendend
endfunction [result] = potential(X, Xk)result = exp(-norm(X - Xk, 2)); % 计算核函数值
end
4.3 测试输入
MATLAB终端输入下面指令
测试potential(X, Xk)
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.00001disp('max on center');
end
if r2 > r1disp('decrease by distance');
end
if r3 - r4 < 0.00001disp('commutativity');
end
测试step2_mission(samples, labels)
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)
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。