Skip to content

finaldong/machine-learning

Repository files navigation

machine-learning

参照《统计学习方法》一书实现了大部分的机器学习算法,关于每个算法的一些理解

代码规范约定

类型名:驼峰命名法,比如LogsticRegress
成员函数与成员变量:首字母小写的驼峰命名,比如getLabelId(),learnRate
下标变量:带一个下划线,比如_beg
局部变量:一个单词的变量名全部小写,比如temp,cnt。多个单词的变量名,首字母小写的驼峰。
代码块:对于类型定义、函数定义,左花括号写在开始行最右侧,对于for和if左花括号另起一行。
有一些例外情况,尚未在代码中修改过来,正在逐渐完善中。

设计思路

对于一个提供代码调用的机器学习系统来说,我们期望它能帮助我们实现超越机器学习算法简单组合的一个系统。从原理上讲,无论多么优秀的代码库设计,都没法做到比更高自由度的自己写代码达到的上限高,那设计一个这样的代码库意义何在呢?其一为了促使自己思考机器学习系统的核心是什么,其二是加深对算法的理解。

对于一个标准的机器学习流程来说,通常被分为以下几个部分,数据预处理,特征工程,超参数选择,模型训练,模型预测。我们发现在这个流水线上,流通的只有两种类型,其一是数据信息集合,其二是模型信息集合。

所以我们可以将它们抽象成两个基本类型。数据类和算法类。
数据类应该提供如下的基本功能:

  • 直接获得原始数据
  • 生成子数据块的引用或者拷贝
  • 通过某种无监督方法生成新的数据类

算法类应该提供如下的基本功能:

  • 初始化模型参数并与一个数据类建立单向联系
  • 通过任意一个评估方法(比如交叉验证,泛化误差,AUC,正则化)选择模型超参数并训练模型
  • 接受数据块输出模型结果

如果我们成功将这些接口设计出来,那么我们就能自由组合生成不同的机器学习流水线。比如采用主成分分析的支持向量机,采用稀疏编码的决策树。

实现细节

数据被定义为具有如下特点的4种类型:

  • 基于数值数据的监督分类数据
  • 基于字符数据的监督分类数据
  • 基于数值数据的监督回归数据
  • 基于数值数据的无监督数据

数据类和算法类是分离的,在每个算法类中都有一个智能指针shared_ptr来实现数据的共享。我们希望在传入数据时,必须先有一个数据类保存了数据,而算法类的构造函数传入shared_ptr参数,来实现在算法类的成员函数中自由调用数据的目的,同时避免数据的拷贝。 ······

About

机器学习算法的代码库,正在构建中

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published