关闭

模式识别几何分类算法实现(二)

标签: 模式识别
569人阅读 评论(0) 收藏 举报
分类:

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
0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:98913次
    • 积分:1588
    • 等级:
    • 排名:千里之外
    • 原创:55篇
    • 转载:49篇
    • 译文:0篇
    • 评论:6条
    最新评论