1.位势函数法:
% 位势函数法的实现
function Kx = potential(dataset,classf)
%input:
%dataset : 训练样本数据集
%classf : 对应的类别集
%output:
%Kx : 最终的位势函数表达式
%% 算法流程
N = size(dataset,1);
class_all = unique(classf);
k = 0;
Nc = 0;
syms x1 x2;
X = cell(1,2);
X{1} = x1;
X{2} = x2;
alpha = 1; % 控制位势函数的衰减速度
while( Nc < N)
kn = mod(k,N)+1;
Xn = dataset(kn,:);
if(k == 0)
if(classf(kn) == class_all(1))
Kx = exp(-alpha * ((X{1}-Xn(1))^2+ (X{2}-Xn(2))^2));
k = k + 1;
continue;
else
Kx = -exp(-alpha * ((X{1}-Xn(1))^2+ (X{2}-Xn(2))^2));
k = k + 1;
continue;
end
end
Kx_f = matlabFunction(Kx); %将符号表达式转化为函数;
if(classf(kn) == class_all(1))
if(Kx_f(Xn(1),Xn(2)) > 0)
Nc = Nc + 1;
else
Kx = Kx + exp(-alpha * ((X{1}-Xn(1))^2+ (X{2}-Xn(2))^2));
Nc = 0;
end
else
if(Kx_f(Xn(1),Xn(2)) < 0)
Nc = Nc + 1;
else
Kx = Kx - exp(-alpha * ((X{1}-Xn(1))^2+ (X{2}-Xn(2))^2));
Nc = 0;
end
end
k = k + 1;
end
end
%% 位势函数
% function y = K(X,Xn,opts)
% syms X;
% alpha = 1; % 控制位势函数的衰减速度
% switch(opts)
% case 1 % 指数函数形式
% y = exp(-alpha * sum((X - Xn).^2));
% case 2 % 分数形式
% y = 1 / ( 1 + alpha * sum((X - Xn).^2));
% end
% end
注意:上述函数得到的是一个表达式kx,需要使用fun = matlabFunction(kx)将其转换为可以传参的函数。
2.支持向量机:
% 最优分类超平面算法实现
function [W,wd] = support_vector(dataset,classf)
%inpput:
%dataset : 样本数据集
%classf: : 样本对应的类别集
%output:
%W : 最优的权向量
%b : 超平面参数
N = size(dataset,1);
class_all = unique(classf);
%% 转化为求解二次规划问题
X = dataset'; %转化为列向量
y = ones(N,1);
for i = 1:N
if(classf(i) == class_all(2))
y(i) = -1;
end
end
H = zeros(N);
for i = 1:N
for j = 1:N
H(i,j) = 1/2 * y(i)* X(:,i)' * y(j) * X(:,j);
end
end
f = -1*ones(1,N);
A = [];
b = [];
Aeq = y';
beq = 0;
lb = zeros(N,1);
ub = [];
opts = optimset('Algorithm','active-set','Display','off');
[lamda,~,~] = quadprog(H,f,A,b,Aeq,beq,lb,ub,[],opts); %解二次规划
W = zeros(2,1); %计算权向量
Nsv = 0; % 统计支持向量的个数
Nsv_y = 0;
Nsv_X = zeros(2,1);
for i = 1:N
if (lamda(i) > 0)
W(1,1) = W(1,1) + lamda(i) * y(i) * X(1,i); % 只有lamda大于0的样本才是支持向量
W(2,1) = W(2,1) + lamda(i) * y(i) * X(2,i);
Nsv = Nsv + 1;
Nsv_y = Nsv_y + y(i);
Nsv_X = Nsv_X + X(:,i);
end
end
wd = 1/Nsv * (Nsv_y - W' * Nsv_X);
end
3.fisher最佳投影方向:
% Fisher 最佳投影方向法实现
function W = Fisher_projective(dataset,classf)
%inpput:
%dataset : 样本数据集
%classf: : 样本对应的类别集
%output:
%W : 最佳投影方向向量
%% 算法流程
row = size(dataset,1);
class_all = unique(classf);
%% 计算类别的均值向量
mean_1 = zeros(1,2);
mean_2 = zeros(1,2);
class1_num = 0;
for i = 1:row
if(classf(i) == class_all(1))
mean_1 = mean_1 + dataset(i,:);
class1_num = class1_num + 1;
else
mean_2 = mean_2 + dataset(i,:);
end
end
mean_1 = mean_1/class1_num; %类别1的均值向量
mean_2 = mean_2/(row - class1_num); %类别2的均值向量
%% 计算类内总离散度矩阵
Sw = zeros(2);
for i = 1:row
if(classf(i) == class_all(1))
temp = dataset(i,:) - mean_1;
Sw = Sw + temp' * temp;
else
temp = dataset(i,:) - mean_2;
Sw = Sw + temp' * temp;
end
end
%% 计算最佳投影方向
W = Sw\(mean_1' - mean_2');
end