关闭

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

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

1.感知器算法:

% 感知器算法的实现
function [W,b] = new_perceptron(dataset,classf,MaxIter)
%% 功能说明
%  求解两类的线性可分问题
%% 参数说明
%input:
%dataset :  训练样本集
%classf  :  对应样本的类别集
%MaxIter :  最大迭代次数
%output:
%W       :  感知器的权值向量
%b       :  感知器的阈值

%% 样本
T=size(dataset,1);      %样本总数
x=dataset(:,1:end-1);
x = x';

class_unique = unique(classf);

d = zeros(T,1);
d(classf == class_unique(1)) = 1;
d(classf == class_unique(2)) = -1;

W=[0 1];  %初始化权值矩阵
b=1;      %初始化阈值
yita=1;   %学习步长

jingdu=0.01;    %最大误差容限
E=1;

%最大迭代次数
if (nargin < 3)
   M = 2000;    %默认的迭代次数
else
   M = MaxIter;
end

N=0;
while (E>jingdu && N<M)
    N=N+1;
    E=0;
    for t=1:T
        a=sgn(W*x(:,t)+b);
        e=d(t)-a;
        if e~=0          %与期望值不同时修改权值和阈值
            p=x(:,t);
            W=W+yita*e*p';   %修正权值向量
            b=b+yita*e;
        end
        E=E+e^2/2;    
    end
end

end

%符号函数sgn
function a=sgn(b)
     if b>=0
         a=1;
     else
         a=-1;
     end
end

2.K-近邻算法:

% K-近邻算法实现
function ox_class = KNN(dataset,classf,k,ox)
%% 参数说明
%input : 
%dataset : 样本数据集
%classf  : 样本对应的类别集  
%k       : K-近邻
%ox      : 待分类的样本向量
%output  : 待分类样本向量的类别

    [row,~] = size(dataset);
    distance = zeros(row,1);
    for i = 1:row
        distance(i) = sqrt(sum((dataset(i,:) - ox).^2));   %利用欧式距离计算相似度
    end
    [~,class_idx] = sort(distance);
    knn_class = class_idx(1:k);
    class_all = unique(classf);  %获取种类的类别总数
    len = length(class_all);
    count_K_class = zeros(len,1);
    for i = 1:len
        for j = 1:k
            if (class_all(i) == classf(knn_class(j)))
                count_K_class(i) = count_K_class(i) + 1;
            end
        end
    end

[~,ox_class_max_idx] = max(count_K_class);
ox_class = class_all(ox_class_max_idx);
end

3.H-K算法的实现:

% H-K算法的实现
function [W,b,isLinearCluster] = HK(dataset,classf)
%input:
%dataset           : 训练样本数据集
%classf            :  对应的样本类别集
%output:
%W                 :  权值向量
%b                 :  阈值向量
%isLinearCluster   :  判断是否是线性可分的
%% 有点小问题,可能陷入死循环!!!
%  可能需要设置一个最大跌代次数限制程序的运行

%% 由训练样本集构建增广矩阵X
[row ,col] = size(dataset);
X = zeros(row,col+1);
class_all = unique(classf);
if (length(class_all)~=2)                 %只考虑两类问题
    return;
else
    for i = 1:row
        if(classf(i) == class_all(1))
            X(i,:) = [dataset(i,:),1];
        else
            X(i,:) = [-dataset(i,:),-1];  %之前忘了在数据集前加个负号,所以一直出错!!!!
        end
    end

   %% H-K算法的流程
    PX = (X'*X)\X';         % == inv(X'*X)*X' 计算X的伪逆
    r = 0.6;                %学习步长
    b = ones(row,1)/10;     %初始化一个正的余向量
    W = PX*b;               %初始化权值向量
    stop = 1;
    while(stop)
       e = X * W - b;
       switch(checkValueofE(e))
           case 1                   %终止算法,是线性可分的
                 stop = 0;
                 isLinearCluster = 1;
           case 2                   %终止算法,不是线性可分的
                 stop = 0;
                 isLinearCluster = 0;
           case 3                   %继续迭代
                 W = W + r * PX * (e + abs(e));
                 b = b + r * (e + abs(e));
        end
    end
end
end

%% 百度上提供的方法,好像更加合理
function flag = checkValueofE(e)

    max_e = max(e);
    min_e = min(e);

    if( min_e > -1e-4 && min_e < 0)
        min_e = 0;
    end

    if min_e > 1e-3
        flag = 3;
    else   
        if min_e >= 0 && max_e < 1e-4  %线性可分
            flag = 1;
        else
            if max_e < 0               %都小于零,线性不可分
                 flag = 2;
            else                       %继续迭代
                 flag = 3;
            end
        end
    end
end

% checkValueofE
%% 我写的方法,好像有问题
% function flag = checkValueofE(e)
%     tol = 1e-6;
%     if (sum(e.^2) < tol) %e的每个分量为0(接近于0),则停止算法
%         flag = 1;
%     else if (sum(e >= 0) == length(e))
%             flag = 1;
%     else if((sum(e <= 0.0001) == length(e)) 
              && (sum( e == 0) ~= length(e)))  % e的每个分量均小于等于0,  但不是全为0,则停止算法
%             flag = 2;
%             else           % e的分量中既有正值也有负值,则继续迭代
%                 flag = 3;
%             end
%         end
%     end
% end


0
0
查看评论

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

1.位势函数法:% 位势函数法的实现 function Kx = potential(dataset,classf) %input: %dataset : 训练样本数据集 %classf : 对应的类别集 %output: %Kx : 最终...
  • FireMicrocosm
  • FireMicrocosm
  • 2015-07-07 13:45
  • 797

模式识别分类器学习(二)

 接上次记的, 到几何分类器, 书里关于几何分类器的内容比较多,其中包括线性分类器和非线性分类器。线性分类器有:感知器算法、增量校正算法、LMSE分类算法、Fisher分类。非线性分类器有:势函数法。我一看到这么多的几何分类器我就晕了,只看了感知器算法。所以我也只记下感知器算法。而神经网络...
  • anthonywanted
  • anthonywanted
  • 2008-10-19 02:23
  • 8125

模式识别 - "分类" 和 "回归" 的区别

"分类" 和 "回归" 的区别   分类问题和回归问题都要根据训练样本找到一个实值函数g(x). 回归问题是: 给定一个新的模式, 根据训练集推断它所对应的输出y(实数)是多少, 也就是使用y=g(x)来推断任一输入x所对应的输出值. 分类问题是:...
  • u012515223
  • u012515223
  • 2013-10-28 15:51
  • 6684

模式识别(Pattern Recognition)学习笔记(十八)--感知器与神经网络

1.什么是人工神经网络(ANN)? 1.1ANN的由来        在人工智能中,有两个研究方向:1)先试图对人类或其他高等动物的自然智能建立一定的数学模型,然后借助这种方式来帮助理解智能活动的奥秘;2)通过数学手段,利用计算机建立具备一定智能的机器。回顾下...
  • eternity1118_
  • eternity1118_
  • 2016-06-03 18:52
  • 1543

模式识别 学习笔记:第六章 其他分类方法 (持续更新中。。。)

本系列博客主要是在学习《模式识别(张学工著 第三版)》时的一些笔记。 本文地址:http://blog.csdn.net/shanglianlm/article/details/495588531 简介近邻法直接根据训练样本对新样本分类; 决策树和随机森林可以应用于非数量特征,并把特征选择与分...
  • shanglianlm
  • shanglianlm
  • 2015-11-02 16:40
  • 1547

正交变换

正交变换
  • jacke121
  • jacke121
  • 2017-02-02 14:25
  • 517

机器学习---EM算法(分类)

很多时候算法没有搞明白其实是一堆符号没有明白是神马意思...所以本文,着重告诉大家,这堆符号,到底都,代表神马! 以下使用到的图片来自上海交大杨旸老师的课件,网址如下:http://bcmi.sjtu.edu.cn/~yangyang/ml/ 我们首先来宏观认识一下EM算法。其实EMs就是K...
  • Sun7_She
  • Sun7_She
  • 2016-05-06 17:14
  • 1930

【机器学习】HK算法(LMSE算法) LMS算法改进保证线性可分时均方误差标准能够找到线性可分的超平面

1.其实HK算法思想很朴实,就是在最小均方误差准则下求得权矢量。 他相对于感知器算法的优点在于,他适用于线性可分和非线性可分得情况,对于线性可分的情况,给出最优权矢量,对于非线性可分得情况,能够判别出来,以退出迭代过程。 2.在程序编制过程中,我所受的最大困扰是:关于收敛条件的判决。 ...
  • LG1259156776
  • LG1259156776
  • 2016-08-07 23:30
  • 1775

模式识别学习——遗传算法

1、主要工作 采用遗传算法对男女生样本数据中的身高,体重,喜欢数学,喜欢文学,喜欢运动,喜欢模式识别共6个特征进行特征选择,并基于所得到的最佳特征采用SVM设计男女生分类器,并计算模型预测性能(包含SE,SP,ACC和AUC )。 2、工作具体内容 2.1 遗传算法介绍 几个术语: 基因链码:使用遗...
  • wulafly
  • wulafly
  • 2016-11-19 00:47
  • 2296

模式识别:感知器的实现

在之前的模式识别研究中,判别函数J(.)的参数是已知的,即假设概率密度函数的参数形式已知。本节不考虑概率密度函数的确切形式,使用非参数化的方法来求解判别函数。由于线性判别函数具有许多优良的特性,因此这里我们只考虑以下形式的判别函数:它们或者是x的各个分量的线性函数,或者是关于以x为自变量的某些函数的...
  • liyuefeilong
  • liyuefeilong
  • 2015-04-23 09:40
  • 13392
    个人资料
    • 访问:131716次
    • 积分:1924
    • 等级:
    • 排名:千里之外
    • 原创:55篇
    • 转载:49篇
    • 译文:0篇
    • 评论:22条
    最新评论