当前位置: 首页 > 科技观察

前端也要懂机器学习2

时间:2023-03-14 22:58:50 科技观察

上一篇介绍了机器学习的基本知识点,本文将开始一些算法的探索。由于我们是前端研发工程师,所以我们选择库ml.js进行编码。本次涉及的算法包括:KNN、决策树、随机森林、朴素贝叶斯、支持向量机、线性回归、K-means聚类算法,这七种算法横跨监督学习算法(分类算法、回归算法)、无监督学习算法,可以作为前端机器学习的必修课,也可以作为即将到来的终端智能时代的必读刊物。1.监督学习算法1.1分类算法1.1.1K-最近邻分类算法(KNN)1.定义如果一个样本的特征空间中k个最相似的样本(即特征空间中的最近邻)中的大部分属于某一类,样本也属于这一类。(通常k为不大于20的整数)二、优缺点1、优点简单有效、精度高、对异常值不敏感、无需训练2、缺点:计算复杂度高、空间复杂度高(计算量大,内存开销大)必须指定K值,如果K值选择不当,无法保证分类精度。(如果K值小,容易受到异常点的影响,容易过拟合;如果K值大,则受到样本平衡问题的影响)3.计算距离。对于KNN算法来说,核心内容就是计算距离。两个样本之间的距离可以通过欧式距离来计算。计算公式为:4.应用场景小数据场景(千到上万样本),可用于字符识别、文本分类、图像识别等领域5.代码constKNN=require('ml-knn');//训练集特征constdataset=[[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]];//训练集目标constlabels=['A','A','B','B'];//实例化KNN算法(用于训练)constknn=newKNN(dataset,labels,{k:3});//待预测点constpredictDataSet=[[0,0],[3,1]];//预测predictLabels=knn.predict(predictDataSet);console.log(predictLabels);//['B','A']1.1.2决策树1.定义决策树(Decision树)是在知道各种情况发生的概率的基础上,通过形成决策树得到净现值的期望值大于等于零的概率的决策分析方法,对项目进行评价风险,并判断其可行性是一个插画n直观地运用概率分析法。决策树是一种树状结构,其中每个内部节点代表对一个属性的测试,每个分支代表一个测试输出,每个叶子节点代表一个类别。二、优缺点1、优点是计算复杂度不高。输出结果很容易理解。它对缺少中间值不敏感。它可以处理连续和类别字段,也可以处理不相关的特征数据。2.缺点可能会过拟合,需要剪枝。对于每个类别中样本数量不一致的数据,信息增益会偏向那些具有更多值的特征。3.应用场景常用于解决分类和回归问题。使用该算法的前提条件是:1.有明确的决策者期望达到的目标2。决策者可以选择的可行方案有两个以上3.决策者无法控制的不确定因素有两个以上4.不同因素下不同方案的收益或损失可以计算5.决策者可以估计不确定因素出现的概率四、关键知识点1、信息熵信息是一个非常抽象的概念,很难量化。为了解决信息的量化度量问题,香农提出了“信息熵”的概念。信息熵以信息为基础,将可能产生的信息定义为一个随机变量,对该变量的期望就是信息熵。信息熵的计算公式为(单位为比特):注:熵用于衡量不确定性。熵越大,不确定性越大,反之亦然。2.信息增益信息增益在决策树算法中使用信息增益来选择特征的索引,信息增益越大,这个特征的选择性越好,在概率论中定义为:被分类的集合和所选特征的条件熵。计算公式为:注:g(D,A)表示特征A对训练数据集D的信息增益H(D)表示集合D的信息熵H(D|A)表示条件熵3.常用算法(1)ID3算法ID3算法使用信息增益作为特征选择的准则。信息增益越大,说明根据该特征分类后可以消除的信息不确定性越多。(2)C4.5算法ID3算法有两大缺点:一是类别多的特征计算的信息增益更大,容易导致决策树宽而浅;二是只能处理离散变量,不能处理连续变量。C4.5在ID3算法的基础上使用信息增益率作为特征选择。通过增加类别的惩罚因子,可以避免类别越多信息增益越大的问题。同时,连续变量也可以通过离散化的方式求解。无法处理连续变量。(3)CART算法C4.5的缺点是不能处理回归问题,用CART解决。CART不使用信息熵来选择最优划分特征,而是使用基尼系数(Giniimpurity)。两者对于衡量信息量的效果是一样的,但是基尼系数由于没有对数运算,可以大大减少计算开销。5.代码constirisDataset=require('ml-dataset-iris');const{DecisionTreeClassifier}=require('ml-cart');//获取训练集中的特征值constdataSet=irisDataset.getNumbers();//获取训练集中的目标值,并转化为标量constlabels=irisDataset.getClasses().map(elem=>irisDataset.getDistinctClasses().indexOf(elem));//实例化决策树的分类器constdTClassifier=newDecisionTreeClassifier({gainFunction:'gini',maxDepth:10,minNumSamples:3});//训练dTClassifier.train(dataSet,labels);constpredictDataset=[[5.1,3.5,1.4,0.2]];//预测constresult=dTClassifier.predict(predictDataset);//将结果转换成对应的文本形式console.log(result.map(value=>irisDataset.getDistinctClasses()[值]));1.1.3RandomForest1.机器学习中的定义,randomforest是一个包含多棵决策树的分类器,其输出类别由单棵树输出类别的模式决定(randomforest是一种融合多棵树的算法通过集成学习的思想,其基本单元是决策树)。2.优缺点1.优点具有极好的精度(由集成算法的特点介绍)抗过拟合能力:通过平均决策树,降低过拟合的风险(由随机特性介绍)可以有效运行On大数据集,处理具有高维特征的输入样本不需要降维来评估每个特征在分类问题中的重要性。2.缺点是会在一些嘈杂的分类或回归问题上过拟合。它比决策树算法更复杂,计算成本更高。三、重要知识点1、随机森林中每棵树的生成规则(A代表训练集中样本总数,N代表训练样本数,M代表特征数)(1)对于每棵树,有放回地从训练集中随机抽取N个训练样本,作为树的训练集(2)指定一个常数m<2..为什么要随机抽取训练集?随机抽样是为了保证每棵树的训练集都是不同的。如果不进行随机抽样,最终训练的分类结果将完全相同。3、为什么要放样抽样?有放回抽样可以保证每次抽样的概率相同,实现独立同分布,保证每棵决策树相互独立。4、与随机森林分类效果(错误率)相关的因素?(1)森林中任意两棵树的相关性:相关性越大,错误率越大(2)森林中每棵树的分类能力:每棵树的分类能力越强,错误率越低整个森林的比率。ml-dataset-iris');const{RandomForestClassifier}=require('ml-random-forest');//获取训练集中的特征值constdataSet=irisDataset.getNumbers();//获取目标值在训练集中,并转换为标量constlabels=irisDataset.getClasses().map(elem=>irisDataset.getDistinctClasses().indexOf(elem));//实例化分类器constrFClassifier=newRandomForestClassifier({seed:3,maxFeatures:0.8,replacement:true,nEstimators:25});//训练rFClassifier.train(dataSet,labels);constpredictDataset=[[5.1,3.5,1.4,0.2]];//预测constresult=rFClassifier.predict(predictDataset);//result转换成相应的文本形式console.log(result.map(value=>irisDataset.getDistinctClasses()[价值]));1.1.4朴素贝叶斯1.定义朴素贝叶斯方法(NBC)是基于贝叶斯亚当斯定理和特征条件独立假设的分类方法。首先通过给定的训练集,以特征词相互独立为前提假设,学习从输入到输出的联合概率分布,然后根据学习到的模型,输入X寻找后验概率最大的输出Y。二、优缺点1、优点朴素贝叶斯模型源于经典数学理论,分类效率稳定,对缺失数据不敏感,算法简单。常用于文本分类,分类准确率高,速度快。2.缺点使用独立样本性假设,如果特征属性相关,效果较差。三、应用场景文本分类文本识别图像识别四、重要知识点一、贝叶斯公式注:贝叶斯公式是打通P(W|C)与P(C|W)的桥梁二、为什么引入拉普拉斯平滑系数为了为防止计算出的分类概率为0,故引入拉普拉斯平滑系数,即令P(W1|C)不为0,其计算公式为:注:其中α为指定系数,一般为1;m是训练文档中统计的特征词的数量。三种贝叶斯模型(1)高斯分布朴素贝叶斯——用于一般分类问题(2)多项分布朴素贝叶斯——适用于文本数据(特征代表次数)(3)伯努利分布朴素贝叶斯——适用于伯努利分布,文本data(特征代表是否出现)五、代码constirisDataset=require('ml-dataset-iris');const{GaussianNB}=require('ml-naivebayes');//获取训练中的特征值setconstdataSet=irisDataset.getNumbers();//获取训练集中的目标值constlabels=irisDataset.getClasses().map(elem=>irisDataset.getDistinctClasses().indexOf(elem));//实例化分类器constgaussianNB=newGaussianNB();//训练gaussianNB。train(dataSet,labels);constpredictDataset=[[5.1,3.5,1.4,0.2]];//预测constresult=gaussianNB.predict(predictDataset);//将结果转换成对应的文本形式console.log(result.map(value=>irisDataset.getDistinctClasses()[value]));1.1.5支持向量机1.定义支持向量机(SVM)为一种广义线性分类器,以监督学习的方式对数据进行二元分类,其决策边界是为学习样本求解的最大间隔超平面。通过不依赖统计方法简化了常见的分类和回归问题。以上支持向量决定了最终的结果,对异常值不敏感,可以帮助抓取关键样本,剔除大量冗余样本。算法简单,“鲁棒性”好。计算的复杂度取决于支持向量的数量。而不是样本空间的维度,从某种意义上说,它避免了“维度灾难”。泛化能力强。2.缺点是难以实现大规模训练样本:SVM的空间消耗主要是存储训练样本和核矩阵。由于SVM支持向量是通过二次规划求解的,而求解二次规划会涉及到m阶矩阵的运算。当m的个数很大时,矩阵的存储和计算会消耗大量的机器内存和计算时间。解决多分类问题的难点:经典的支持向量机算法只给出了二分类算法,解决多分类问题需要通过组合多个二分类支持向量机来解决(一对多组合方式,一对一组合模式和SVM决策树)。对参数和核函数选择敏感:支持向量机的性能主要取决于核函数的选择。3.应用场景SVM在各个领域的模式识别问题上都有应用,包括肖像识别、文本分类、手写字符识别、生物信息学等。四.重要知识点1.重要概念(1)线性可分性:在二维空间中,两类点被一条直线完全分开称为线性可分性(2)最大区间超平面:从二维空间到多维空间,将两个点集完全正确地划分,形成一个超平面,为了让这个超平面更加鲁棒,它会找到最好的超平面(即最大区间超平面,它划分了将两类样本分开的超平面)。(将两类样本分在超平面的两边,两边距离超平面最近的样本点到超平面的距离最大化)(3)支持向量:样本中最靠近超平面的一些点超平面称为支持向量(4)软区间:对于不能完全线性可分的样本,可以引入软区间。与硬区间的苛刻条件相比,软区间允许单个样本出现在区间带中。(注:硬区间和软区间都是指样本完全线性可分或者大部分样本点线性可分)2.对于线性不可分处理方法,将线性不可分样本映射到高维空间,使得样本在高维空间维空间是线性可分的。这时维数的增加会增加计算量,所以需要使用核函数来辅助处理。引入核函数后,就不需要计算高维甚至无限维空间的内积了。3、引入核函数的好处(1)减少计算量(2)减少用于存储数据的内存量4、常用核函数的分类(1)线性核函数(2)多项式核函数(3)高斯核函数5.代码constSVM=require('libsvm-js/asm');constsvm=newSVM({kernel:SVM.KERNEL_TYPES.RBF,type:SVM.SVM_TYPES.C_SVC,gamma:1,cost:1});constdataSet=[[0,0],[1,1],[1,0],[0,1]];constlabels=[0,0,1,1];//训练svm.train(dataSet,labels);//预测constpredictedLabel=svm.pred1.2回归算法1.2.1线性回归1.定义线性回归是利用回归方程(函数)比较一个或多个自变量(特征值)与因变量(目标值)之间的关系)一种建模关系的分析方法。只有一个自变量的情况称为单变量回归,多个自变量的情况称为多元回归。二、优缺点1、优点是思路简单,易于实现,建模速度快。对于数据量小、关系简单的情况非常有效。它需要对非线性模型有强大的基本了解,并且结果非常易于解释。对决策分析很有用。可以解决回归问题缺点对于非线性数据或数据特征之间的相关性多项式回归很难建模很难很好地表达高度复杂的数据3.应用场景趋势线(时间序列数据的长期趋势)流行病学和金融学(分析计算投资的系统性风险)经济学(预测消费支出、固定投资支出等)4.重要知识点回归目的——预测数值目标值回归绩效评价指标——均方误差(MSE)过拟合(1)定义:一个构造在训练数据上可以获得比其他假设更好的拟合,但在测试数据集上不能很好地拟合数据。这时候就认为这个假设存在过拟合现象。(模型太复杂)(2)原因:原始特征太多,有一些噪声特征(3)解决方法:正则化4.欠拟合(1)定义:一个假设无法在训练数据上获得很好的拟合setfit,而不能很好的在测试数据集上拟合数据,此时,认为这个假设欠拟合。(模型太简单)(2)原因:学习数据的特征太少(3)解决方法:增加数据的特征数量5、正则化(1)L2正则化L2正则化可以使一些W变得很小(接近于0),削弱了某个特征的影响。岭回归是使用的L2正则化。(2)L1正则化L1正则化可以让部分W值直接为0,删除对整个特征的影响。LASSO回归使用L1正则化。5.代码constSimpleLinearRegression=require('ml-regression-simple-linear');constx=[0.5,1,1.5,2,2.5];consty=[0,1,2,3,4];constregression=newSimpleLinearRegression(x,y);constresult=regression.predict(3);控制台日志(结果);2.无监督学习算法2.1K-means聚类算法1.定义K-means聚类算法是一种迭代求解的聚类分析算法,其步骤为:随机设置K个特征空间中的点作为初始聚类中心,计算到K个中心的距离对于每个其他点,选择最近的聚类中心点作为位置点的标签类别,然后重新计算每个聚类的新中心点(平均值)。如果计算出的新中心点与原中心点相同,则结束,否则再次进入第二步过程。二、优缺点1、优点原理简单易实现,算法复杂度低,可解释性强。在处理大数据集时,该算法可以保证良好的可扩展性。当簇近似高斯分布时,效果很好。2.缺点K值需要手动设置,不同的K值得到的结果是不同的。对初始聚类中心敏感,不同的选择方法会给出不同的结果。对异常值敏感,需要样本的平均值(数据类型有限)。不适合过于离散的分类,不平衡样本类别的分类,非凸形状。分类可能会收敛到局部最小值3.代码constkmeans=require('ml-kmeans');//所有需要聚类的数据constdata=[[1,1,1],[-1,-1,-1],[-1,-1,-1.5],[1,2,1]];//质心constcenters=[[1,2,1],[-1,-1,-1]];constans=kmeans(data,2,{initialization:centers});console.log(ans);本文转载自微信公众号“放风筝的人”,可通过以下二维码关注。转载本文请联系致远公众号。