本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记: AI学习笔记(17)---《累积势函数分类》
理解并掌握势函数的数学定义和物理含义,并根据要求实现一个势函数。
理解并掌握累计势函数判别法的基本思想以及算法步骤,并根据要求实现一个势函数。
定义点 Xk
处的势函数 K(.,X_k)
,它应满足:
势函数可以用来描述空间中一个点电荷的电势分布。
这个电荷在空间中所处的位置即为 Xk
所描述的位置。距离该点电荷距离测度越近,则电势越高;距离越远,则电势越低,并且电势随距离的变化是连续的。当距离该点电荷距离无限远时,电势趋近于 0,且不会为负(相对于正电荷来说)。
空间中点电荷电势分布特征正好符合前面所定义的势函数的一些特性。这也是势函数的一项物理含义。
有两种构造势函数的方法,其中第一类方法是用对称的有限多项式展开,即:
第二类方法是直接选择双变量的对称函数作为势函数,例如:
势函数分类法是将二分类问题中的样本点看做正负电荷,并将他们的势函数叠加起来构成判别函数,即位势为 0 的判决界面。其基本思想如下:
ω1
和 ω2
的模式样本,这些样本可以看成是分布在 n 维模式空间中的点 Xk
;
ω1
的点比拟为正电荷,势函数为正,相对地把属于 ω2
的点比拟为负电荷,势函数为负;
从势函数可以看出,累计位势起着判别函数的作用。
对于一个新的样本 Xk+1
以及前 k
个样本所构成的累计势函数 Kk(X)
:
Xk+1∈ω1
时, Kk(Xk+1)>0
,或者当 Xk+1∈ω2
时,Kk(Xk+1)<0
,判别正确,累计势函数不用做任何修改;
Xk+1
正确判别。
由于一个模式样本的错误分类造成累计势函数在训练时的变化,因此累计势函数分类算法提供了确定 ω1
和 ω2
两类判别函数的迭代过程。
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
,返至第三步。function [result] = potential(X, Xk)
result = exp(-norm(X - Xk, 2)); % 计算核函数值
end
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
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.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)
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)
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。