Shark源码分析
文章平均质量分 68
tuqinag
这个作者很懒,什么都没留下…
展开
-
Shark源码分析(一):数据的存储(1)
Shark源码分析(一):数据的存储(1)Shark是一个使用C++开发的机器学习库,里面还有一些深度学习的算法例如:自编码器、限制玻尔兹曼机、循环神经网络等。对于熟悉机器学习、深度学习算法的流程还是很有帮助的,同时能够增强你对于C++的理解能力,特别是对于模板的应用能力。源码的可读性我觉得也比较不错,就是在有一些注释写的不是非常清楚。该项目的主页是http://image.diku.dk/shar原创 2017-01-26 11:32:17 · 1623 阅读 · 1 评论 -
Shark源码分析(十一):随机森林算法
Shark源码分析(十一):随机森林算法关于这个算法的介绍,可以参看我之前关于集成算法的博客。因为Shark中关于决策树算法只实现了CART算法,所以随机森林算法中也只包含了CART算法。如果你已经看过了我之前写的关于CART算法源码分析的博客,看到后面就会发现它与随机森林算法的代码其实差不多。只是在选择最优划分属性时多了一个随机选取候选集的过程。这也是随机森林算法的一大特点。因为CART算法既可以原创 2017-01-26 11:54:07 · 2178 阅读 · 3 评论 -
Shark源码分析(十):KNN算法
Shark源码分析(十):KNN算法关于这个算法,我之前已经有博客详细介绍过。虽然说这个算法看上去非常的简单,但是在搜索k个最近邻居数据点时,还是非常具有技巧性的。这里还是有必要再次强调一下。如果输入数据的维度不高,可以使用树形结构(kd树)来加快查找的速度。如果输入的维度较高,则利用树型结构的速度与计算两两数据间距离的速度并不会有太大的差别。之后我们要介绍的代码也是利用kd树来组织的。在计算距离时原创 2017-01-26 11:53:01 · 1202 阅读 · 0 评论 -
Shark源码分析(九):朴素贝叶斯算法
Shark源码分析(九):朴素贝叶斯算法关于这个算法,我之前也有写过博客来介绍过。但是Shark在实现时,它只考虑到了输入为连续属性值的情况,而没有考虑到离散属性值的情况。至于连续属性值的情况该如何计算,可以参考下我的博客。AbstractDistribution类既然我们需要计算分布情况,那我们需要有一个类来表示分布。AbstractDistribution类就是表示所有分布的基类,该类定义在文件原创 2017-01-26 11:52:19 · 984 阅读 · 0 评论 -
Shark源码分析(八):CART算法
Shark源码分析(八):CART算法决策树算法是机器学习中非常常用的一种算法。在我关于机器学习的博客中有对决策树算法进行详细的介绍。在Shark中,只实现了CART这一种类型的决策树,它可以用于分类任务或是回归任务中。在这里我们只对其中有关分类任务的部分代码进行分析。CARTClassifier类这个类用于定义决策树,该类定义在文件<include/shark/Models/Trees/CARTC原创 2017-01-26 11:51:27 · 986 阅读 · 1 评论 -
Shark源码分析(七):神经网络
Shark源码分析(七):神经网络对于神经网络这里应该就不用叙述了吧,之后可能会写一些关于深度学习方面的博客。这里要介绍的神经网络,名字应该叫做前馈神经网络(Feed-Forward Networks)。至于这个神经网络为什么要叫前馈,是因为这个网络在拓扑结构上不含有反向边,也就是没有环。而不是指的信号不能反向地传递。对于单个神经元,Shark提供了几种激活函数以供选择:Logistic函数,输出原创 2017-01-26 11:50:05 · 1018 阅读 · 0 评论 -
Shark源码分析(六):k-means算法
Shark源码分析(六):k-means算法k-means算法是原型聚类算法中一个非常典型的算法。关于聚类算法,我之后应该会在博客中进行详细说明。对于整个聚类算法来说,可以分为两类:硬聚类与软聚类。对于硬聚类,每一个数据点只能属于某一个簇。对于软聚类来说,则没有这一限制。首先还是来看一下整个聚类算法基类。ClusteringModel类ClusteringModel类定义在<include/shar原创 2017-01-26 11:48:13 · 1081 阅读 · 0 评论 -
Shark源码分析(五):线性回归算法与Lasso回归
Shark源码分析(五):线性回归算法与Lasso回归为什么上一篇还是三,这一篇就跳到五了呢?其实我们原来提到过:方法=模型+策略+算法方法 = 模型+策略+算法这里的模型与算法我们之前都已经提到过了,虽然只是介绍了一个基类,并没有涉及到其具体的实现。在这里我们就会揭开其真正面目了。『策略』我们还没有介绍过,其实就是目标函数,在前面一些较为简单的算法中并没有涉及到这块。为了整个逻辑的完整性,我还是打原创 2017-01-26 11:41:27 · 1382 阅读 · 0 评论 -
Shark源码分析(四):目标函数及其优化
Shark源码分析(四):目标函数及其优化我们之前反反复复地强调过,Shark的设计策略是:方法 = 模型 + 策略 + 算法。这里的策略指的就是目标函数。我们的目标是从假设空间中选取最优的模型,需要考虑的是按照什么样的准则学习或选择最优的模型。选择一个好的目标函数形式,也是算法最终取得好的效果的一个重要组成部分。在确定了目标函数之后,我们还需要考虑的就是如何对其进行优化。在Shark中,将定义目标原创 2017-01-26 11:40:14 · 1034 阅读 · 0 评论 -
Shark源码分析(三):数据预处理之正则化
Shark源码分析(三):数据预处理之正则化在机器学习算法中,获取训练数据后首先要做的不是将输入投入训练方法中进行学习,而是应该对数据进行预处理。预处理过程输出数据的质量能够对之后算法的结果起着至关重要的作用。预处理过程含有非常多的操作,在我目前阅读代码的过程中只碰到了正则化这一过程。那我们就先来讨论正则化,如果之后再碰到了其他的方法再补充。Shark将对输入数据进行正则化的模型也看作是一个线性模型原创 2017-01-26 11:37:47 · 812 阅读 · 0 评论 -
Shark源码分析(一):数据的存储(2)
Shark源码分析(一):数据的存储(2)上一篇博客中说到了实际存储数据的SharedContainer类,但是联系到实际中输入的数据可能会有不同的形式,比如说无标签数据和有标签数据,无法都使用SharedContainer类来存储,否则就无法方便地获取数据对应的标签。所以Shark将SharedContainer类封装在了一个名为Data的类中。之后又有两个类,UnlabeledData和Labe原创 2017-01-26 11:36:57 · 835 阅读 · 0 评论 -
Shark源码分析(二):模型与训练方法
Shark源码分析(二):模型与训练方法之前两篇博客都说的是整个架构底层的东西,如何来存放输入的数据,以便于在计算时进行加速。而这一篇呢,会向上走一点,来看一看如何将模型进行抽象。在『统计机器学习』中有提到这样一句话,『统计学习方法是由模型、策略和算法构成的』。Shark正是按照这种划分来构建整个库的架构。在监督学习过程中,模型就是所要学习的条件概率分布或是决策函数。Shark是将几个比较类似的算法原创 2017-01-26 11:33:08 · 1095 阅读 · 0 评论 -
Shark源码分析(十二):线性SVM
Shark源码分析(十二):线性SVM关于svm算法,这个在我关于机器学习的博客中已经描述的比较详实了,这里就不再赘述。svm主要有三种类型,这里我所介绍的是线性svm算法的代码。相较于使用核函数的svm算法,代码的整体框架应该是一样的,只是在对偶问题的求解上所使用的方法可能是不一样的。LinearClassifier类这个类所表示的是算法的决策平面,是一个多分类的线性分类模型。定义在<includ原创 2017-01-26 11:55:08 · 1390 阅读 · 0 评论