关注公众号“执鸢者”,回复“资料”获取500G资料(各“兵种”均有),还有专业交流群等你一块儿来潇洒。(哈哈)上一篇文章讲述了机器学习的基本知识点,这一篇就开启一些算法的摸索之路。既然咱们是前端研发工程师,那就选择ml.js这个库进行编码。本次涉及到的算法包含:KNN、决策树、随机森林、朴素贝叶斯、支持向量机、线性回归、K-均值聚类算法,这七个算法横跨监督学习算法(分类算法、回归算法)、非监督学习算法,能够做为前端入门机器学习的必修课程,也可做为既将到来的端智能时代的必读刊物。javascript
1、定义前端
若是一个样本在特征空间中的k个最类似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。(一般k是不大于20的整数)
2、优缺点java
优势算法
缺点dom
3、计算距离机器学习
对于KNN算法,最核心的内容是计算距离,两个样本之间的距离能够经过欧氏距离计算。其计算公式为:
![]()
4、应用场景函数
小数据场景(几千~几万样本),可用于字符识别、文本分类、图像识别等领域
5、代码post
const KNN = require('ml-knn'); // 训练集特征 const dataset = [ [1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1] ]; // 训练集目标 const labels = ['A', 'A', 'B', 'B']; // 实例化KNN算法(进行训练) const knn = new KNN(dataset, labels, { k: 3}); // 须要进行预测的点 const predictDataSet = [[0, 0], [3, 1]]; // 进行预测 predictLabels = knn.predict(predictDataSet); console.log(predictLabels);// [ 'B', 'A' ]
1、定义性能
决策树(Decision Tree)是在已知各类状况发生几率的基础上,经过构成决策树来求取净现值的指望值大于等于零的几率,评价项目风险,判断其可行性的决策分析方法,是直观运用几率分析的一种图解法。决策树是一种树形结构,其中每一个内部节点表示一个属性上的测试,每一个分支表明一个测试输出,每一个叶节点表明一种类别。
2、优缺点学习
优势
缺点
3、应用场景
经常使用于解决分类和回归问题,用该算法的前提条件是:
1. 具备决策者指望达到的明确目标 2. 存在决策者能够选择的两个以上的可行的备选方案 3. 存在决策者没法控制的两个以上不肯定因素 4. 不一样方案在不一样因素下的收益或损失能够计算出来 5. 决策者能够估计不肯定因素发生的几率
4、重点知识点
信息是很抽象的概念,很难进行量化对量,为了解决对信息的量化度量问题,香农提出了“信息熵”的概念。信息熵是在信息的基础上,将有可能产生的信息定义为一个随机变量,变量的指望就是信息熵。信息熵的计算公式为(单位为比特):
![]()
注:熵是用来度量不肯定性,熵越大则其不肯定性越大,反之越小
信息增益在决策树算法中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好,在几率论中定义为:待分类的集合的熵和选定某个特征的条件熵之差。其计算公式为:
![]()
注:
(1)ID3算法
ID3算法是采用信息增益做为特征选择的标准,信息增益越大,说明按此特征分类后越能消除信息的不肯定性。
(2)C4.5算法
ID3算法具备两大缺点:一个是类别越多的特征计算出的信息增益越大,易致使生成的决策树广而浅;另外一个是只能处理离散变量,不能处理连续变量。C4.5是在ID3的算法基础上采用信息增益率做为特征选择,经过增长类别的惩罚因子,规避了类别越多信息增益越大的问题,同时也能够对连续变量经过均值离散化的方式解决没法处理连续变量的问题。
![]()
![]()
(3)CART算法
C4.5存在不能处理回归问题的缺点,该缺点由CART解决。CART不在经过信息熵的方式选取最优划分特征,而是采用基尼系数(基尼不纯度),二者衡量信息量的做用至关,但基尼系数因为没有对数运算,可大大减小计算开销。
![]()
![]()
5、代码
const irisDataset = require('ml-dataset-iris'); const { DecisionTreeClassifier } = require('ml-cart'); // 获取训练集中的特征值 const dataSet = irisDataset.getNumbers(); // 获取训练集中的目标值,并转换为标量 const labels = irisDataset .getClasses() .map(elem => irisDataset.getDistinctClasses().indexOf(elem)); // 实例化决策树的分类器 const dTClassifier = new DecisionTreeClassifier({ gainFunction: 'gini', maxDepth: 10, minNumSamples: 3 }); // 进行训练 dTClassifier.train(dataSet, labels); const predictDataset = [[5.1,3.5,1.4,0.2]]; // 进行预测 const result = dTClassifier.predict(predictDataset); // 结果转换为对应的文本形式 console.log(result.map(value => irisDataset.getDistinctClasses()[value]));
1、定义
在机器学习中,随机森林是一个包含多个决策树的分类器,其输出的类别是由个别树输出的类别的众数而定(随机森林就是经过集成学习的思想将多棵树集成的一种算法,其基本单元是决策树)。
2、优缺点
优势
缺点
3、重要知识点
(1)对于每棵树随机有放回的从训练集中抽取N个训练样本,做为该树的训练集
(2)指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的
(3)每棵树都尽最大程度的生长,而且没有剪枝过程。
随机抽样是为了保证每棵树的训练集都不同,若不随机抽样会致使最终训练出的分类结果彻底同样。
有放回的抽样才能保证每次抽取时的几率是同样的,达到独立同分布,可保证每一棵决策树都是相互独立的。
(1)森林中任意两棵树的相关性:相关性越大,错误率越大
(2)森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低
(注:减少特征选择个数m,树的相关性和分类能力会相应下降,反之会随之增大)
4、代码
const irisDataset = require('ml-dataset-iris'); const { RandomForestClassifier } = require('ml-random-forest'); // 获取训练集中的特征值 const dataSet = irisDataset.getNumbers(); // 获取训练集中的目标值,并转换为标量 const labels = irisDataset .getClasses() .map(elem => irisDataset.getDistinctClasses().indexOf(elem)); // 实例化分类器 const rFClassifier = new RandomForestClassifier({ seed: 3, maxFeatures: 0.8, replacement: true, nEstimators: 25 }); // 进行训练 rFClassifier.train(dataSet, labels); const predictDataset = [[5.1,3.5,1.4,0.2]]; // 进行预测 const result = rFClassifier.predict(predictDataset); // 结果转换为对应的文本形式 console.log(result.map(value => irisDataset.getDistinctClasses()[value]));
1、定义
朴素贝叶斯法(NBC)是基于贝叶斯定理与特征条件独立假设的分类方法。先经过已给定的训练集,以特征词之间独立做为前提假设,学习从输入到输出的联合几率分布,再基于学习到的模型,输入X求出使得后验几率最大的输出Y。
2、优缺点
优势
缺点
3、应用场景
4、重要知识点
注:贝叶斯公式是打通P(W|C)和P(C|W)的桥梁
为了防止计算出的分类几率为0,因此引入拉普拉斯平滑系数,即让P(W1|C)不为0,其计算公式为:
注:其中α为指定系数,通常为1;m为训练文档中统计出的特征词个数
(1)高斯分布朴素贝叶斯——用于通常分类问题
(2)多项式分布朴素贝叶斯——适用于文本数据(特征表示的是次数)
(3)伯努利分布朴素贝叶斯——适用于伯努利分布、文本数据(特征表示的是是否出现)
5、代码
const irisDataset = require('ml-dataset-iris'); const { GaussianNB } = require('ml-naivebayes'); // 获取训练集中的特征值 const dataSet = irisDataset.getNumbers(); // 获取训练集中的目标值 const labels = irisDataset .getClasses() .map(elem => irisDataset.getDistinctClasses().indexOf(elem)); //实例化分类器 const gaussianNB = new GaussianNB(); // 进行训练 gaussianNB.train(dataSet, labels); const predictDataset = [[5.1,3.5,1.4,0.2]]; // 进行预测 const result = gaussianNB.predict(predictDataset); // 结果转换为对应的文本形式 console.log(result.map(value => irisDataset.getDistinctClasses()[value]));
1、定义
支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面。
2、优缺点
优势
缺点
3、应用场景
SVM在各领域的模式识别问题中有应用,包括人像识别、文本分类、手写字符识别、生物信息学等。
4、重要知识点
(1) 线性可分:在二维空间上,两类点被一条直线彻底分开叫作线性可分
(2)最大间隔超平面:从二维扩展到多维空间中,将两个点集彻底正确地划分开就造成一个超平面,为了使这个超平面更具鲁棒性,则会找最佳超平面(即为最大间隔超平面,该平面是以最大间隔把两类样本分开的超平面)。(两类样本分别分割在该超平面的两侧、两侧距离超平面最近的样本点到超平面的距离被最大化了)
(3)支持向量:样本中距离超平面最近的一些点叫支持向量
(4)软间隔:对于不可以彻底线性可分的样本可引入软间隔,相比于硬间隔的苛刻条件,软间隔容许个别样本出如今间隔带里面。(注:硬间隔和软间隔均是在说样本的彻底线性可分或者大部分样本点的线性可分)
将线性不可分样本映射到高维空间中,使样本在高维空间线性可分,此时因为维度提升会致使计算量增大,因此须要使用核函数帮助处理,引入核函数后就不须要计算高维甚至无穷维空间的内积了。
(1)减小了计算量
(2)减小了存储数据的内存使用量
(1)线性核函数
(2)多项式核函数
(3)高斯核函数
5、代码
const SVM = require('libsvm-js/asm'); const svm = new SVM({ kernel: SVM.KERNEL_TYPES.RBF, type: SVM.SVM_TYPES.C_SVC, gamma: 1, cost: 1 }); const dataSet = [[0, 0], [1, 1], [1, 0], [0, 1]]; const labels = [0, 0, 1, 1]; // 进行训练 svm.train(dataSet, labels); // 进行预测 const predictedLabel = svm.pred
1、定义
线性回归是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。只有一个自变量的状况称为单变量回归,大于一个自变量的状况叫作多元回归。
![]()
2、优缺点
优势
缺点
3、应用场景
4、重要知识点
(1)定义:一个建设在训练数据上可以得到比其它假设更好的拟合,可是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合现象。(模型过于复杂)
(2)缘由:原始特征过多,存在一些嘈杂特征
(3)解决办法:正则化
4.欠拟合
(1)定义:一个假设在训练数据集上不能得到很好的拟合,而且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
(2)缘由:学习到数据的特征过少
(3)解决办法:增长数据的特征数量
(1)L2正则化
L2正则化可使得其中一些W都很小(接近于0),削弱某个特征影响。Ridge回归就是用的L2正则化。
(2)L1正则化
L1正则化可使得其中一些W的值直接为0,删除整个特征的影响。LASSO回归用的就是L1正则化。
5、代码
const SimpleLinearRegression = require('ml-regression-simple-linear'); const x = [0.5, 1, 1.5, 2, 2.5]; const y = [0, 1, 2, 3, 4]; const regression = new SimpleLinearRegression(x, y); const result = regression.predict(3); console.log(result);
1、定义
K均值聚类算法是一种迭代求解的聚类分析算法,其步骤为:
2、优缺点
优势
缺点
3、代码
const kmeans = require('ml-kmeans'); // 须要进行聚类的所有数据 const data = [[1, 1, 1], [-1, -1, -1], [-1, -1, -1.5], [1, 2, 1]]; // 质心 const centers = [[1, 2, 1], [-1, -1, -1]]; const ans = kmeans(data, 2, { initialization: centers }); console.log(ans);
1.若是以为这篇文章还不错,来个分享、点赞吧,让更多的人也看到
2.关注公众号执鸢者,领取学习资料(前端“多兵种”资料),按期为你推送原创深度好文