
算法与理论研究
文章平均质量分 52
Lin-JM
这个作者很懒,什么都没留下…
展开
-
Boosting方法解析
一个单独的检测器很少能够完全或者足够好地解决一个问题;认识到这一点,把很多独立的分类器结合起来来提高整体性能是常见的。这些孤立的单个检测器通常可能很弱(就是说,对于一个二分类问题,检测器的性能可能比50%稍微好一点)。循环地使用这个简单的规则,每次作用于训练样本的不同子集。这种算法称作Boosting(提升)算法,它能够提高任何给定的学习算法的性能,并具有普遍意义。经过多次调用这些弱分类器,Boosting算法把所有弱规则的输出结合成为一个单独的分类规则,比任何一个其构成的弱规则都更精确。原创 2013-08-28 10:18:48 · 1599 阅读 · 0 评论 -
libsvm代码阅读:关于Cache类的分析
下面来分析Cache类的源码,该类位于svm.cpp中。这个类的主要功能是:负责运算所涉及的内存管理,包括申请、释放等。简单来说:这个Cache类,首先通过Cache构造函数申请一块空间,这块空间的大小是:L个head_t大小的空间。然后get_data函数保证结构head_t中至少有len个float的内存,并且将可以使用的内存块的指针放在data指针中;而swap_index函数则是用于交换head[i]和head[j]。Cache类的定义如下:class Cache{public: Cac原创 2014-02-20 21:01:28 · 3290 阅读 · 0 评论 -
libsvm代码阅读:基础准备与svm.h头文件
Update:2014-2-25 LinJM @HQU libsvm是国立台湾大学Chih-Jen Lin开发的一个SVM的函数库,是当前应用最广泛的svm函数库,从2000年到2010年,该函数库的下载量达到250000之多。它的最新版本是version 3.17,主要是对是svm_group_classes做了修改。libsvm函数包的组织结构如下:1、主文件路径:包含了核心的C/C++程序和例子数据。其中svm.cpp是svm的核心程序,它实现了svm的训练和测试算法。2、tool子文件路径原创 2014-02-19 19:07:23 · 6360 阅读 · 0 评论 -
libsvm代码阅读:关于Kernel类分析
这一篇博文来分析下Kernel类,代码上很简单,一般都能看懂。Kernel类主要是为SVM的核函数服务的,里面实现了SVM常用的核函数,通过函数指针来使用这些核函数。其中几个常用核函数如下所示:(一般情况下,使用RBF核函数能取得很好的效果)全部代码如下://// Kernel evaluation//// the static method k_function is for doing single kernel evaluation// the constructor of Kernel原创 2014-02-21 12:16:21 · 3772 阅读 · 2 评论 -
libsvm代码阅读:关于svm_group_classes函数分析
upadate :2014-2-28 LinJM @HQU 『 libsvm专栏地址:http://blog.youkuaiyun.com/column/details/libsvm.html 』目前最新的version是3.17,主要的改变是在svm_group_classes函数中加了几行代码。官方的说明如下:svm_group_classes函数的功能是:group training data of the same classImportant:如何将一堆数据归类到一起,同类的连续存储!可参考这个函数。原创 2014-02-28 13:39:08 · 3810 阅读 · 0 评论 -
EM算法主观理解
一句话: EM算法的精华在于 EM——期望最大化,把一个不好MLE的问题用迭代方法解决掉,思路清晰,计算简单。首先,明确我们的目标是什么:那就是要求解一个最大似然估计问题。所谓的最大似然估计问题就是——给定一组数据和一个参数待定的模型,如何确定模型的参数,使得这个确定参数后的模型在所有模型中产生已知数据的概率最大。如果你还是对最大似然估计不了解,那么你可以参看如下的资料:原创 2014-03-03 22:53:40 · 1800 阅读 · 0 评论 -
双边滤波器解析与代码
双边滤波器(Bilateral Filtering)是一种可以保边去噪的滤波器。双边滤波这个概念最初由Tomasi和Manduchi在文献[1]提出,在处理相邻各像素值的灰度值或彩色信息时,不仅考虑到几何上的邻近关系,也考虑到了亮度上的相似性,通过对二者的非线性组合,自适应滤波后得到平滑图像。这样处理过的图像在滤除噪声的同时还能够很好地保持图像的边缘信息。简单地讲:双边滤波器类似于高斯滤波器,它也是给每一个邻域像素分配一个加权系数。不过, 这些加权系数包含两个部分, 第一部分加权方式与高斯滤波一样,第二原创 2014-03-24 17:12:55 · 8031 阅读 · 1 评论 -
GA遗传算法解析
谈及遗传算法,我首先想到的就是孟德尔的豌豆实验。当然,遗传算法实质上并不能用豌豆实验说明,豌豆实验探讨了分离定律和自由组合定律,而遗传算法所借鉴的并不是这两个定律。遗传算法,简单的讲,就是达尔文的适者生存的原理,当新结果的适应度比原来的适应度高,那么这个结果就保存下来,并遗传给下一代,就是把好的留下来(这个“好的”,“怎么好”,就是我们根据具体情况具体定义的)。闲话说完,那么咱们就来系统的看看遗传算法比较正式的说法是什么: 遗传算法是计算机科学人工智能领域中用于解决最优化的一种搜索启发式算法,原创 2013-08-13 22:55:52 · 4555 阅读 · 1 评论 -
稀疏表达:向量、矩阵与张量
稀疏表达是近年来SP, ML, PR, CV领域中的一大热点,文章可谓是普天盖地,令人目不暇给。老板某门课程的课程需要大纲,我顺道给扩展了下,就有了这个上中下三篇介绍性质的东西。遗憾的是,我在绝大多数情况下实在不算是一个勤快的人,这玩意可能充满bug,更新也可能断断续续,尽请诸位看官见谅了。顺道一提,ICCV09有一个相关的 tutorial 。据传博文里公式数量和其人气是成反比例关系的,原创 2013-10-23 11:21:31 · 5684 阅读 · 0 评论 -
convnet源码解析(一):基础准备
ConvNet是一个基于GPU实现的卷积神经网络开源代码(C++11),是由多伦多大学的Geoffrey Hinton深度学习团队编写的,它的最初版本是Hinton的学生Alex Krizhevsky编写的cuda-convnet(其项目地址在google code上面),最近cuda-convnet也从1.0版本更新到2.0版本(地址)。在CNN的开源代码中最出名的主要有两个,一个是Berkeley Caffe,另一个是Toronto Convnet。Berkeley的Caffe我目前还没有研究过它的代原创 2014-07-25 12:58:30 · 8346 阅读 · 4 评论 -
支持向量机学习笔记:数学过程及经典Tutorial
支持向量机,听名字,真的很让人充满好奇,到底什么是支持向量机,是一种什么机器???后来上了模式识别课才知道,原来支持向量机就是一个算法,不是什么机器,而且归结起来是一种信号处理方式,底子还是《现代信号处理》中内容。首先,我们可以来了解一下SVM的历史过程:推荐的中文博客Free Mind 的支持向量机系列文章,能够让你快速地掌握SVM的相关概念和原理;July 整理的支持向量机通俗导论,比较全地介绍了SVM的各个过程;如果你想透彻地理解SVM,而且English不错,那么下面几个Tutoria原创 2014-01-15 20:49:19 · 6459 阅读 · 2 评论 -
BP神经网络解析
第一次接触BP神经网络是在模式分类的课上,第二次接触是在Stanford的机器学习课上。接触多次,但都没有具体把它应用到研究中去。这次要做学术报告,打算试验一下它在分类识别中的效果如何,也逼自己具体代码实现一遍。BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则原创 2013-08-11 11:16:28 · 15277 阅读 · 4 评论 -
CUDA学习日志:线程协作与例程
在上篇博文中,我们已经用CUDA C编写了一个程序,知道了如何编写在GPU上并行执行的代码。但是对于并行编程来说,最重要的一个方面就是,并行执行的各个部分如何通过相互协作来解决问题。只有在极少数情况下,各个处理器才不需要了解其他处理器的执行状态而彼此独立地计算出结果。即使对于一些成熟的算法,也仍然需要在代码的各个并行副本之间进行通信和协作。因此,下面我们来讲讲不同线程之间的通信机制和并行执行线程的同步机制。首先,我们来看一个线程块的网格示意图:原创 2014-11-25 17:22:03 · 3346 阅读 · 0 评论 -
BP神经网络的C代码分析
去年在学习Stanford的ML课程的时候整理过一篇BP神经网络原理的解析,链接地址,不过没有对它的code实现作太多的解读,只是用MATLAB的工具箱做了实验。Jeremy Lin具体的原理性资料可以参考:[1] BP神经网络解析 http://blog.youkuaiyun.com/linj_m/article/details/9897839[2] Tom M.Mitchell 机器学习教从上面的算法流程可以看出来,BP神经网络的步骤并不多,如果你之前就了解BP神经网络,那么上面的流程应该还是可以很顺利地原创 2014-11-01 17:58:02 · 7168 阅读 · 1 评论 -
中值滤波的快速算法
我想学过图像处理的人没有人会不知道中值滤波的,最早的时候我是在冈萨雷斯的图像处理课本[1]中学到的,后来在看Sonka的书[2]的时候又看到了中值滤波的介绍,下面我试着结合课本所学和网上的资料自己整理一篇中值滤波的介绍。Jeremy Lin中值滤波器是一种统计排序滤波器,由Tukey于1971年在文献[3]中提出。所谓的统计排序滤波器是一种非线性的空间滤波器,它的响应基于图像滤波器包围的图像区域中像素的排序,然后用统计排序结果决定的值代替中心像素的值。除了中值滤波器外,最大值滤波器和最小值滤波器也是统计原创 2014-09-09 15:18:37 · 18672 阅读 · 5 评论 -
libsvm代码阅读:关于Solver类分析(一)
现在我们涉及到的Solver类是一个SVM优化求解的实现技术:SMO,即序贯最小优化算法。libsvm中最原始的Solver的代码有六百多行,再加上各种变形就上千行了,为了下面好理解,我们先来看看理论问题。代码的开头如下:// An SMO algorithm in Fan et al., JMLR 6(2005), p. 1889--1918// Solves://// min 0原创 2014-02-22 21:07:00 · 5152 阅读 · 0 评论 -
libsvm代码阅读:关于svm_train函数分析
在svm中,训练是一个十分重要的步骤,下面我们来看看svm的train部分。在libsvm中的svm_train中分别有回归和分类两部分,我只对其中分类做介绍。分类的步骤如下:统计类别总数,同时记录类别的标号,统计每个类的样本数目将属于相同类的样本分组,连续存放计算权重C训练n(n-1)/2 个模型初始化nozero数组,便于统计SV//初始化概率数组训练过程中,需要重原创 2014-02-24 22:19:30 · 10004 阅读 · 0 评论 -
libsvm代码阅读:svm.cpp浅谈和函数指针
svm.cpp总共有3159行代码,实现了svm算法的核心功能,里面总共有Cache、Kernel、ONE_CLASS_Q、QMatrix、Solver、Solver_NU、SVC_Q、SVR_Q 8个类(如下图1所示),而它们之间的继承和组合关系如图2、图3所示。在这些类中Cache、Kernel、Solver是核心类,对整个算法起支撑作用。在以后的博文中我们将对这3个核心类做重点注解分析,另外还将对svm.cpp中的svm_train函数做一个注解分析。函数指针是指向函数而非指向对象的指针。像其他指针原创 2014-02-20 10:43:32 · 4858 阅读 · 1 评论 -
稀疏模式识别解析
基于信号稀疏表示的图像识别方法是基于过完备字典对测试样本的表示具有稀疏性这一先验知识,将识别问题看作是多个线性回归模型的分类问题,从稀疏的角度得到对图像最紧致的表示。文献Robust face recognition via sparse representation提出了稀疏表示的分类算法SRC,该算法将测试样本表示为训练样本的加权线性组合,通过L1范数优化求取稀疏解,使得除测试样本所属类别原创 2013-09-06 21:59:34 · 4735 阅读 · 0 评论 -
交叉验证(CrossValidation)解析
交叉验证(Cross-validation),是统计学上一种将数据样本(dataset)切割成较小子集的实用方法。该方法先在一个子集上做分析,而其它子集则用来做后续对此分析的确认及验证。一开始的子集被称为训练集(train set),而其它的子集则被称为验证集(validation set)。交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力。Cross validation is a model evaluation method that is better than res原创 2013-10-04 12:18:45 · 4004 阅读 · 0 评论 -
图像分析:LBP特征解析与代码
LBP(Local Binary Patterns),即局部二值模式,是一种描述图像局部空间结构的非参数算子。芬兰Oulu大学的T.Ojala等人于1996年提出这个算子用来分析图像纹理特征,并且描述了它在纹理分类中的强区分能力。LBP算子定义为一种灰度尺度不变的纹理算子,是从局部邻域纹理的普通定义得来的。基本思想是:用中心像素的灰度值作为阈值,与它的邻域相比较得到的二进制码来表述局部纹理特征。在纹理分析方面,LBP算子是最好的纹理描述符之一,它的主要优点有以下几点:Ø 通过它的定义可知,LBP算子的原创 2013-08-29 11:00:16 · 5960 阅读 · 1 评论 -
图像分析:分水岭算法解析
分水岭算法是一个流行的图像处理算法,用于快速地分割图像为同类区域。它背后的原理就是,如果将图像视为拓扑结构的地图,那么均质区域对应的是被陡峭边缘包围的平坦盆地。这么讲,可能大家还不是很明白,接下来我们详细地分析一下这个算法。1、算法来源分水岭算法的思想来源于地形学,它将图像看作是地形学上被水覆盖的自然地貌,图像中的每一像素的灰度值表示该点的海拔高度,其每一个局部极小值及其影响区域称为集水盆,两集水盆的边界则为分水岭,通常描述分水岭变换有两种方法:一种是“雨滴法”,即当一滴雨水分别从地形表面的不同位置开原创 2013-09-23 17:51:33 · 11083 阅读 · 0 评论 -
三阶近邻识别分类法
一旦图像被投影到子带空间中,剩下的任务就是判别这些图像的相似性。判别图像的相似性有两种方法:一种是计算N维空间中图像间的距离,另一种是测量图像间的相似性。当测量距离时,距离应尽可能的小,一般选择距离测试图像最近的训练图像作为它所属的类别。而测量相似性时,图像应尽可能的相似,也就是说具有最大相似性的训练图像类被认为是测试图像所属的类别。三阶近邻法是计算像素的差值的绝对值。距离公式可表示为:原创 2013-09-26 18:17:21 · 5643 阅读 · 0 评论 -
算法导论:插入排序和归并排序
算法:非形式地说,就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。插入排序插入排序的工作方式像许多人排序一手扑克牌。每一步将一个待排序的元素,按其大小插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。伪代码:升序原创 2013-10-15 17:29:09 · 1122 阅读 · 0 评论 -
自适应滤波器及LMS自适应算法的理解
粗略地讲,滤波器就是信号抽取器,它的作用是从被噪声污染的信号中抽取出原来的信号。在信号抽取中应该满足某种优化准则,如Wiener滤波器应该使输出滤波器的均方估计误差为最小。具体来讲,Wiener滤波器这种滤波方法是在已知所要处理的数据统计方面的先验知识的情况下,通过求解Wiener-Hopf方程,对平稳随机信号进行最优预测和滤波。遗憾的是,在实际应用中常常无法得到信号特征先验知识,Wiener滤波器无法解决这种情况下的问题。在这种情况下,自适应滤波器能够得到比较好的滤波性能。原创 2013-11-03 19:10:43 · 19249 阅读 · 2 评论 -
最小二乘法简述
今天学习分形理论的分形维数计算过程,其中最后一步是利用最小二乘法来估计出分形维数。看到后,半天没反应过来,最小二乘?是什么东西。只能上wiki去找答案了:The method of least squares is a standard approach to the approximate solution of overdetermined systems, i.e., sets of equations in which there are more equations than unknowns.原创 2013-11-26 16:46:01 · 3067 阅读 · 0 评论 -
彩色空间及cvtColor解析
首先,我们要了解:什么是彩色空间呢?许多人都知道在绘画时可以使用红色、黄色和蓝色这三种原色生成不同的颜色,这些颜色就定义了一个色彩空间。我们将品红色的量定义为X 坐标轴、青色的量定义为Y坐标轴、黄色的量定义为Z坐标轴,这样就得到一个三维空间,每种可能的颜色在这个三维空间中都有唯一的一个位置。但是,这并不是唯一的一个色彩空间。例如,当在计算机监视器上显示颜色的时候,通常使用RGB(红色、绿色、蓝色)色彩空间定义,这是另外一种生成同样颜色的方法,红色、绿色、蓝色被当作X、Y和Z坐标轴。另外一个生成同样颜色的原创 2014-01-20 17:16:18 · 3218 阅读 · 0 评论 -
模式识别学习算法泛化性能的界限
模式识别学习算法泛化性能的界限A Bound on the Generalization Performance of a Pattern Recognition Learning Machine假设有L个样本,每个样本包含如下一对数据(x_i,y_i ),其中,向量□(x_i∈R^n,i=1,…,L) ,y_i为给定的标签。具体来讲,在树的识别问题中,x_i代表一个像素灰度值的向量,而y_i=1 (若图像中有树)或y_i=0 (若图中无树)现在假设这些数据存在未知的概率分布P(x_i,y) ,例如翻译 2014-01-14 21:13:02 · 2129 阅读 · 0 评论 -
支持向量机学习笔记:LIBSVM应用(人脸识别)
如果你已经看完并理解了我的上一篇SVM的博客,那么接下来你要面对的是怎么应用SVM这个实际的问题,现在SVM里面应用最广泛的就是LIBSVM这个函数库,OpenCV中也基于LIBSVM推出了CvSVM 的函数。因此下面的内容,我主要是介绍一下LIBSVM的应用方法,主要是参考文献[1,2]。LIBSVM是国立台湾大学 Chih-Jen Lin开发的一个SVM的函数库,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数原创 2014-01-15 23:06:08 · 7245 阅读 · 1 评论 -
libsvm代码阅读:关于Solver类分析(二)
如果你看完了上篇博文的伪代码,那么我们就可以开始谈谈它的源代码了。// An SMO algorithm in Fan et al., JMLR 6(2005), p. 1889--1918// Solves://// min 0.5(\alpha^T Q \alpha) + p^T \alpha//// y^T \alpha = \delta// y_i = +1 or -1原创 2014-02-22 22:15:04 · 4758 阅读 · 1 评论