人工智能之机器学习算法

所有的机器学习算法都是要优化的,优化的必要条件是确定优化的目标函数(损失函数),目标函数是根据实际问题(数据)转成的数学公式。

一.线性回归原理推导

(1)回归问题概述

在机器学习的有监督算法中,分类与回归二种情况。分类就是好像去银行贷款,它会告诉你能贷款还是不能贷款。而回归问题是告诉你可以具体贷款多少钱。

例1:去银行贷款,银行会据不同年龄与工资收入的数据(两个特征),来决定给你贷款多少钱(两个特征组合得到的贷款金额)。目标:那预测银行会贷款多少钱给你(标签)。

解:工资与年龄都会影响银行能贷多少钱给你,那各自有多大影响呢?(参数)。Y=K1*X1+K2*X2,其中X1与X2表示数据中的工资与年龄,K1与K2是参数,Y就是能贷款的额度(标签)

(2)误差项定义

1)Y=K1*X1+K2*X2+b,其中b就是做微调的,尽量去拟合数据。我们要知道X1,X2,Y构成的行列式是矩阵来的,即我们对数据的所有操作都是对矩阵进行操作的,但是公式中的b没有与其他列相乘,所以我们在做数据时通用增加一列为1(1乘以任何数还是等以任何数)的常数表示X0,这样就变成Y=K1*X1+K2*X2+bX0,这样就是矩阵计算了。

2)误差

真实值与预测值之间肯定会存在差异的,所以用b来拟合它,b就称误差(截距)。机器学习中通常给出数据,然后你告诉目标函数(损失函数),让机器去学习什么样的参数使它更接近目标。当损失函数等以0表示做得很完美,真实值等以预测值了,误差也为0了。

(3)独立同分布的意义

误差是独立并且貝有相同分布,并且服从均值为0方差为s的高斯分布。

1)独立性:张三与李四一起去贷款,他俩没关系,是相互独立的

2)同分布:张三与李四来的都是同一家银行

3)高斯分布:银行可能会多给,也可能少给,但绝大数情况下这个浮动不会太大,极少情况下浮动大一点,符合正常现象。

(4)似然函数的作用

1)预测值与误差:y=kx+b,其中k是参数,b是误差项

2)误差服从高斯分布:P(b)=(1/2*圆周率后开根再乘以标准差)*e的(-(b-u)的平方/2s)次方,其中误差的均值u=0的,s为方差。对1)式变形后b=y-kx代入到这个公式后得到3)中公式,因为我们主要得到参数k,所以误差要被替换掉。

3)P(y|x;k)=(1/2*圆周率后开根再乘以标准差)*e的(-(y-kx)的平方/2s)次方,其中P(y|x;k)表示参数k与样本x组合完后越接近y越好,也就是说P(y|x;k)值越大越好,那就是现在最终目的求出当参数k是什么值时P(y|x;k)值最大,即是要得到这个极值点k值,所以就用下面的似然函数。

4)似然函数。

对3)变形:似然函数L(k)=P(y|x;k)的累乘=((1/2*圆周率后开根再乘以标准差)*e的(-(y-kx)的平方/2s)次方)的累乘,为什么是累乘,因为是有多个样本的,并且这些样本都是独立同分布的,而独立同分布成立的前提是联合概率密度等以边缘概率密度的乘积。这个公式告诉我们什么样的参数与数据组合完后恰好是真实值。

对累乘不好求,那就前面加对数转成累加(log a*b=log a+log b的格式),因为对数中的乘法可转成加法,故变成:log  L(k)=log  ((1/2*圆周率后开根再乘以标准差)*e的(-(y-kx)的平方/2s)次方)的累乘,因为是得到极值点k值,所以这里加log来计算没影响。

(5)参数求解

1)对上面的log  ((1/2*圆周率后开根再乘以标准差)*e的(-(y-kx)的平方/2s)次方)的累乘 进行求解,得到 log  ((1/2*圆周率后开根再乘以标准差)*e的(-(y-kx)的平方/2s)次方)进行累加求和。继续把常数项提取出来并把e去掉变成log  (1/2*圆周率后开根再乘以标准差)-(1/s)*(1/2)*(-(y-kx)的平方/2s)次方累加,对这个式子分析,要想值最大,那么(1/s)*(1/2)*(-(y-kx)的平方/2s)次方累加这个被减数最小,把1/s也当作常数项,剩下的(1/2)*(-(y-kx)的平方/2s)次方累加后最小值就行,这个也是最小二乘法。

2)对最小二乘法的式子中的参数k求偏导,并且偏导值为0就行,这里的x,y都是矩阵来的噢,最后得到参数k=((x的转置*x)的求逆)*x的转置*y,注意如果求逆不存在的话,k值就会无解。

(6)梯度下降

梯度下降可当作优化算法,是机器学习中的一种求解思路。

为什么叫梯度下降?首先他是与梯度反方向的,并且对应点的切线方向下降(类似下山)下得更快,多个点就要不断算出梯度。

1)引入:我们得到一个目标函数(loss损失函数)后,如何进行求解?直接求解吗?(并不一定可解,线性回归可当作一个特例)

2)常规套路:机器学习的套路就是交给一堆数据给机器,然后告诉他什么样的学习方式是对的(目标函数),然后让它朝这个方向去做。

3)如何优化:一口吃不成胖子,要一步一步完成迭代。

4)对目标函数进行优化过程时是分别对不同参数k进行优化的(最后使结果为0时取到相应的参数k),因为样本x是独立的。寻找山谷最低点也是目标函数终点(什么样的参数使得目标函数达到极值点)。

5)下山几步走(更新参数)?<1>找到当前最合适的方向(对k进行偏导)<2>走一小步,不走大步,因为容易跌倒<3>按照方向与步伐去更新参数。

(7)优化参数设置

1)通过小批量(batch size)梯度下降法来解决一大批梯度下降或随机单一梯度下降出现的问题,即通常所说的batch size,一般batch size越大可能效果好一点,但也要考虑速度。例batch size等以64,128或256等。

2)学习率(步长):对结果产生比较大的影响,一般设置小一些,例设置为0.001,0.01等

二.线性回归代码实现

略,下次更新

三.模型评估方法

略,下次更新

四.线性回归实验分析

(1)参数直接求解方法

按最小二乘法后得到了参数k=((x的转置*x)的求逆)*x的转置*y,我们现在要构造回归方程。

思路:用代码先构造出x,y随机数据,对数据预处理(例归一化,补一列x0=1的值),然后按公式k=((x的转置*x)的求逆)*x的转置*y直接进行求解得到参数值(这里的x,y都是矩阵来的)。最后构造测试数据,把得到的参数值乘以测试数据等以y1得到相应的回归方程,最后可画图出来。

这个思路存在的问题:在做矩阵求逆时,如果这矩阵不能求逆的话,这个公式就不能使用了。机器学习的思想也不是直接套公式进行计算的,而是拿到数据后逐步进行计算,一步一步优化的,最终得到最优解(损失函数值很小),梯度下降就是这个典型思想。

(2)预处理对结果的影响

1)像上面直接用公式算出各个参数的方法,其实在sklean中也有封装好的api给直接调用的了,只要实例出线性回归对象,调用fit方法进行训练得到结果,取结果的属性(例权重与偏置值)值就是和上面计算出的参数值一样。

sklearn(全称 Scikit-Learn)是一个基于 Python 语言的机器学习库,用于数据挖掘和分析。它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,提供了许多常用的机器学习算法,并且接口设计简单。sklearn 主要包含以下六大任务模块:

分类 - 如逻辑回归、支持向量机等。

回归 - 如线性回归、岭回归等。

聚类 - 如 K-means、层次聚类等。

降维 - 如主成分分析(PCA)、线性判别分析(LDA)等。

模型选择 - 如交叉验证、网格搜索等。

预处理 - 如特征缩放、编码分类特征等。

sklearn 库的目的是简化机器学习任务的实现过程,让数据科学家和开发者能够更加高效地完成各种预测建模工作。

2)我们知道梯度下降中,若学习率(步长)太小,收敛速度会慢点;但学习率太大,学习效果不好。在绝大多数目标函数都是凸函数(类似开口向上的杯子),所以在逐步求解过程时会遇到局部最低点认为是全局最低点的情况(因为凸函数的性质是局部最小值就是全局最小值)。

3)标准化的作用

基本上所有任务中,拿到数据后就先做标准化或归一化,使它们的特征范围控制好一点,使它们的值浮动小一点,这样在优化过程中收敛快点(1条曲线下来,不会出现波动较大的曲线形式),而且效果也会好点。这也是预处理的作用。

(3)梯度下降模块(批量梯度下降)

1)先指定学习率(步长,例用r表示),迭代次数。第一步指定样本数(例m=100),随机构造出x与y数据,对权重参数(例最终的k值,它有几个要与数据特征有几个一样,因为它要与kx匹配的)先做随机的初始化。第二步做迭代进行批量梯度优化计算,直接用公式得gradients=(2/m)*(k*x-y)*(x转置),得出这个值后就按k=k-r*k,其中r是指学习率,最后可打印出k值来。

第三步就可用得出来的参数k进行预测了,直接按y1=kx这格式计算预测即可。最后还可以画图出来(例如用plot(x,y1,指定展示的颜色)这方法进行画图)。总结从(1)至(3)三种方式都可以得到参数值

(4)学习率对结果的影响

对(3)中迭代中用不同学习率传入进去更新得到相应参数并进行预测,并且每迭代一次画出图来,会得出如下结果:学习率(步长)越小学得慢一点,但越饱和效果更好。但学习率应要在迭代不断进行优化过程时,要变得越来越小(学习率衰减),学习得更细,别错过最优解,使目标函数值越小(就好像刚开始是整体的模型会比较模糊,最后阶段是精细到每个细节会看得清晰点)。(3)与(4)都是针对批量梯度下降来说的。

(5)随机梯度下降

epoch:迭代完所有样本数据就是1个epoch。

batch_size:每迭代一次取的样本数据。例如总共有2000个数据,每个batch_size=200,那么迭代10次就完成1个epoch,如果epoch=10,那就是总共迭代10*10=100次。

先构造出每次迭代学习率下降的方法(例每算一次梯度后就降一点点)与epoch值,随机生成参数k,现在对epoch进行for循环,内层循环是样本总数(例m表示),在里面随机生成索引下标,按下标取出随机样本(包括前面所说的随机生成的x与y)中的值来。这时就可以按前面的方式(gradients=2*(k*x-y)*(x转置))计算梯度了,再然后计算学习率下降后的值r(epoch*m+1表示计算完梯度后的数量,把这数量作为参数给开始构造出的学习率下降的方法中得到每一次的学习率),得出这个值后就按k=k-r*k进行参数更新,其中r是指学习率,同样有了参数后就可以进行预测了,最后可在图像中打印出来。

效果感觉这种随机选样本优化梯度的方式也不是很好。

(6)小批量(minibatch)梯度下降

它是综合前面二种梯度下降来做的,先定义minibatch大小,然后还是按epoch进行循环,当循环完一个epoch(即训练完一次所有样本)就重新shuffle洗牌一次,洗牌操作目的就打乱数据,让下一次epoch按minibatch取到的学习样本不一样,不shuffle的话可能取到的数据一样(这洗澡过程就是随机生成索引去原数据中去取)。对里面的循环就是按minibatch大小来取一批数据进行梯度优化计算与学习率衰减调用,与随机取一条样本不同。如果这里加多一个随机种子seed的话,每次的训练结果会固定不变的,因为每批训练的数据变成一样了。

(7)不同策略效果对比

按刚才三种梯度下降计算出并保存(用append方法可把每次迭代后的参数值放入定义的数组中)下的参数值k里的权重值分别画图画出来。可从图看出,批量梯度下降的变化幅度没那么大,就感觉像一条直线向最优值方向发展的,这样对于上亿级别的样本计算可能行不通;而随机梯度下梯则变化幅度最大且效果最不好;小批量梯度下降刚有点波动但效果也蛮好(趋近于批量下降的效果)的,小批量梯度下降在深度学习中经常采用,貝体定义minibatch大小就结合机器的性能了,越大效果也许越好。

(8)多项式回归

先构建出曲线分布的数据来(二次或多次方的数据,即y=k*x的平方+x+b),在sklean中可用ploynomialFeatures方法把原来特征变成几次方(由参数degree值决定是几次),原来特征数据会保留。然后就还是用线性回归模型来训练与预测这些数据。打印到图像中看到曲线形式的数据一样可用线性模型来拟合训练的。

(9)模型复杂度

在sklean的pipeline与standardscaler类中分别用作类似流水线操作(在参数中指定每一步的顺序即可,例转成多次方------>标准化------>训练)与标准化操作,构建出pipeline实例后,就调用fit进行训练数据,最后预测数据并画图出来。本例就按(8)中做出多次方的实验看,1次方的是线性,而平方的是曲线,更高次的就是像心电图的曲线不断地拟合数据,更高次的决策方程越复杂(训练上效果不错,但预测过程中也许就不好)并且过拟合更高。

一般要做ploynomial的话,都会调pipeline这个相结合来用,就如本例。

(10)样本数量对效果的影响

刚才说到过拟合,那怎么解决呢?过拟合归根到底还是数据引起吧。那数据量大还是小时对过拟合影响大呢?

在sklean中的metrics类主要是用来做评估的,这类中不但对分类,回归模型都可做评估,其它模型也可用这个类来评估,例如回归中的mean_squared_error方法就是均方误差来评估的(需传入预测值与真实值),还要用到训练与测试数据切分方法train_test_split。然后就按训练结果与测试后的结果分别做均方误差评估,结果发现,训练集在数据量比较小的时候均方误差值较小(表现可以),但是较小样本预测时均方误差较大,这就容易出现过拟合了;而随样本数量不断增大后,训练与测试的均方误差值越接近,这样过拟合风险就越小。

同样可以对多项的过拟合情况用这个评估图上展现出来。

总结:数据量越大,过拟合风险越小。对数据增强也可降低过拟合风险。数据量一样,多项式的次方越大(决策方程越复杂)过拟合风险就越大。

(11)正则化作用

正则化是为了解决过拟合的。例如y=1*x1+0*x2+0*x3+0*x4,y1=(1/4)*x1+(1/4)*x2+(1/4)*x3+(1/4)*x4,其中x1=x2=x3=x4=1,这时算出的y=y1=1,说明第一种只用到一个特征值(x1)就得到一样的值(其它三个特征没考虑进),说明它只关注局部特征,没关注到全局的特征。像这种y=y1的情况下均方误差值是一样的,那怎样选这二种参数值呢?这就要加多一个正则化来判断了,现在假设一个参数k1对应的4个值是[1,0,0,0],k2对应的4个值是[1/4,1/4,1/4,1/4],并且均方误差值是MSE(k),并且MSE(k1)=MSE(k2)=MSE(k)=1,因为这均方误差值一样,所以要加多一个损失值公式是(a/2)*(k的平方)的累加和,这里的累加是指参数值有几个就是加几个,例如1的平方+0的平方+0的平方+0的平方=1,所以最后加了正则损失的公式后的整体损失公式为 j(k)=MSE(k)+(a/2)*(k的平方)的累加和,其中(a/2)可当作正则损失的惩罚系数,因为a/2,MSE(k)都是一样的,所以(k的平方)的累加和越小,j(k)就会越小,走势会更平稳,本例中k2会更小一点。像j(k)这个加了正则化损失公式的公式叫岭回归公式。

(12)岭回归与lasso(增加正则化的两种算法)

1)在sklean中有一个ridge方法就是岭回归方法。做如下实验:先导入岭回归的包,构造x与y等数据,构造一个方法(参数包构外面传入的模型,正则化惩罚参数alphas,是否ploynomial),方法里面如果ploynomial为真就用pipeline管道方式结合传入的参数实例化出model出来,否则不用pipeline实例用原始方式(即直接用参数传过来的模型付给model),最后用model进行训练与预测,并最后图像上打印出来。

2)由实验告诉我们,结合岭回归损失公式j(k)=MSE(k)+(a/2)*(k的平方)的累加和,其中(a/2)是正则损失的惩罚系数(用alphas表示),结论是如果alphas越大,走势将更平稳,模型会更稳定,过拟合风险会越小。

3)另外一个加了正则化的损失公式是lasso,lasso=j(k)=MSE(k)+(a)*(k的绝对值)的累加。它与岭回归的不同点是它这里是k的绝对值,而岭回归是k的平方。在sklean中有一个lasso方法可供直接调用。

加了正则化后的岭回归与lasso目的就是防范模型复杂化造成过拟合。

(13)实验总结

1)机器学习中核心思想是不断迭代与更新的,不能直接算出来,这里的线性回归实验直接算出结果来就当作巧合吧。

2)梯度下降:它是优化算法。学习率尽可能小并且迭代过程越来越小;拿数据后首先标准化与归一化;实际中用minibatch梯度下降比较多(batchsize越大越好);多项式回归时degree越大特征就越复杂,这样过拟合风险越高,n次方越高特征做得越复杂,维度是指特征个数;数据集越小训练效果好但预测效果不好,这时容易过拟合,所以数据量越大越好;正则化是通过alphas来对参数进行惩罚(惩罚力度越大,得到的决策方程越平稳),让这些权重参数尽可能平滑些,表现稳定些,越大效果越好,模型越不会过拟合;多做实验多对比才能得出那个模型更好。

五.逻辑回归算法

回归是得到具体的预测值,分类可能得到多个类别结果(如2分类或更多分类),例如学生考试成绩预测出在0分到100分之间的某个值是回归任务;而成绩小于70的是差学生,成绩大于等以70的是好学生就是分类任务。

(1)逻辑回归算法原理

1)逻辑回归算法不是回归算法,而是分类算法,经典的有二分类算法。

2)机器学习算法选择:先简单再复杂(例先分类再回归)

3)逻辑回归的决策边界可以是非线性的。线性回归中我们得到一个预测值,分类就可在预测值上通过激活函数(转为非线性)映射到概率上来,这就得到分类任务了。

4)sigmoid函数

<1>公式为g(z)=1/(1+e的(-z)次方),其中自变量取值为任意实数,值域是[0,1]。

<2>原理解释就是将输入的任意值映射到[0,1]之间。也就是把任意值映射到sigmoid函数就是完成值到概率的转换,这就是分类任务。

(2)化简与求解

1)预测函数。结合上面公式g(z)=1/(1+e的(-z)次方),把z用线性回归中的kx代入,预测函数变成g(z)=H(kx)=1/(1+e的(-kx)次方),其中kx是很多个累加和(例k1x1+k2x2等)。

2)分类任务。P(y=1 |x;k)=H(kx);P(y=0 |x;k)=1-H(kx);由这二个公式整合后就变成P(y |x;k)=(H(kx))的y次方*(1-H(kx))的(1-y)次方

3)对整合后的公式 P(y |x;k)=(H(kx))的y次方*(1-H(kx))的(1-y)次方 的解释,对于二分类(0,1)来说,当y=0代入整合后公式时就还原回原来未整合前公式P(y=0 |x;k)=1-H(kx);当y=1代入整合后公式时就还原回原来未整合前公式P(y=1 |x;k)=H(kx)

4)对整合后公式算损失。它与线性回归类似,通过似然函数与对数似然再到梯度下降。

<1>似然函数。似然函数L(k)=P(y |x;k)的累乘=(H(kx))的y次方*(1-H(kx))的(1-y)次方后的累乘,其中假设P(y=1 |x;k)=H(kx),为什么是累乘?因为它是有多个样本。

<2>对数似然。因为累乘对于大量样本时是无法计算,那就在似然前面加个对数log转成累加吧,这样就有 log  L(k)=(y*log  (H(kx))+(1-y)*log (1-H(kx)))后的累加,其中假设P(y=1 |x;k)=H(kx)。这时应用梯度上升求最大值(这里不是用最小二乘法了,因为映射到的值越大参数可能越重要,越小认为参数不是很重要),引入j(k)=(-1/m)*(log  L(k))转为梯度下降任务,因为人们习惯认为损失一般越来越小的,所以这里加多一个负号进行取反操作就转为梯度下降了。

<3>解对数似然。对对数似然公式中的参数k求偏导,并且偏导值为0就行,中间推导比较复杂,直接得到结果是:j(k)的偏导结果=(-1/m)*(((y-g(kx))*x)的累加和),注意g(kx)就是上面的预测函数,x与y都是矩阵来的,都是有多条样本来的(所以要累加)。到这一步是求出梯度了

<4>有梯度就可做参数更新。

参数更新:k=k-a*(-1/m)*(((g(kx)-y)*x)的累加和,这里的a是指学习率,a越小越好。

<5>多分类任务softmax。由上面的二分类变成多分类,类似做了归一化的感觉。

<6>逻辑回归做分类任务真的很好用,它能一下子得出参数值来,不像神经网络或支持向量机一样很多参数无法解释,似个黑盒子一样。所以拿到任务可从最简单的逻辑回归试试,不行再用高级点的算法。

六.逻辑回归代码实现

七.逻辑回归实验分析

(1)逻辑回归实验概述

线性回归是预测出数值出来,而逻辑回归是在一定范围区间的数值下映射成分类。

1)实验目的对鸢尾花数据集进行二分类与多分类(softmax)。首先用sklean中的datasets模块把内置的数据集导入进来,这个模块内置很多数据集的,例用load_iris导入鸢尾花数据集,即实例化出一个实例,然后用这个实例名.DESCR就可得出它的描述信息,而实例名.keys()就可知这个数据集有那些属性可调用(例如data)。

2)鸢尾花数据集默认是3个分类的,每个样本有4个特征(4个维度),现在做成2分类的话要做一些判断。当调用data属性后列出多个维度,现在我们作设只用花瓣长度这个维度作为x,而y就是把某一种花的标签设置成1,其它二种花就设置成0,这样就构建出x与y了。

(2)概率结果随特征数值的变化

假设实例化出LogisticReGression对象为logic,然后logic.fit(x,y)就可做训练了。训练后就用这个模型做预测了(调用predict_proba方法传入预测数据<构建成一维数据>),得到预测的概率值来方便在图像中展示。这样預测出每个样本对应的2类概率值,2类概率值加起来都等以1。然后打印出测试样本与概率值的图像出来,发现特征值越大(花瓣宽度)属于这种类别的概率值越高。

(3)坐标棋盘制作

1)最终要画出决策边界(例如这些样本落在这个区域的概率有多少),首先得到等高线(即每种样本对应的相同概率值在三维立体上画出来的线,其它二维就是2个特征),然后把这相同概率画出的等高线映射到二维平面中就得到决策边界线了。所以现在就先构建出2维特征的数据付给x,然后y就是还是二类,调用fit进行训练。

2)构建棋盘坐标

调用numpy中的meshgrid方法构建出二维的x0,x1样本数据出来(这些数值范围要结合实际训练时的数值范围来确定),x0与x1都是2列的。

然后这数据集调用ravel对x0与x1进行拉长,然后用numpy的c_把这二个拉长后的数据集拼接起来表示需预测的数据x2。拼接后的样本数等以x0与x1的样本数的乘积,其实就是做了笛卡尔乘积。这样组合后的值就可以把每个样本用坐标表示出来了。

(4)分类决策边界展示分析

1)用训练好的模型调用predict_proba方法对拼接后的棋盘上的坐标数据x2,这样会得到预测的概率值。

2)有概率值后就可画出等高线来了,先把x0与x1样本画出来,然后取出概率值中的其中一个为y1(每个样本有二列的概率值,要么是这种花的概率,要么不是这种花的概率,按二维数组下标取出来就行了),然后调用contour就可画出等高线出来了(把x0,x1与概率值y1传入),这里返回一个值假设y2,最后画图工貝再调用clabel(y2)方法会把概率值打在等高线上。等高线上标注的概率值越大,说明就越接近预测的那种花。

3)LogisticRegression中的c参数是指正则化惩罚参数,这个值越大说明加入正则化越小(这个是倒着来的噢),这样过拟合风险越大。

(5)多分类softmax

1)softmax计算概率

其实它就是做了归一化操作。公式为p=u(k)=(e的k次方)/e的每个类别的值次方之和,这个公式中用e的多少次方目的是放大差距,把类别分得开,除以和就是归一操作得到0到1间的概率值。例如k值等以3种类别的得分值分别为2,2.5,3,所以对应每种类别的softmax=(e的2次方)/(e的2次方)+(e的2.5次方)+(e的3次方),另外二个值分别是(e的2.3次方)/(e的2次方)+(e的2.5次方)+(e的3次方),(e的3次方)/(e的2次方)+(e的2.5次方)+(e的3次方)

2)损失函数(交叉熵)

j(v)=(-1/m)*(每个m对应的y*softmax计算出的这个类别概率值取对数)之和*全部m之和。由公式可知当这个类别的概率越大(越接近1),由对数曲线可知这个概率值取对数后的绝对值(相当于损失公式中的负号运算)就越小,这也就告诉我们某个y值对应的概率越大时,它的损失就越小,交叉熵值越小。

3)还是用LogisticRegression构造出softmax的逻辑回归对象出来,这里只需传入参数multi_class与solver。然后就和上面方式类似进行训练,预测与画等高线等。

八.聚类算法

(1)kmeans算法概述

1)聚类概述

它是个无监督问题,因为手里无标签;聚类是指相似的东西分到一组;难点是如何评估与调参。

2)kmeans基本概念

1)要得到簇的个数,需指定k值告诉机器。

2)质心:均值,即向量各维取均值即可,这样就可确定每个簇的中心点,偏历每个样本时如果与质心距离最小就归到这个质心对应的簇中。

3)距离的度量:常用欧几里得距离和余弦相似度(须先标准化),例如算二点的距离。

4)kmeans算法的优化目标:每个簇的所有样本点到每个簇的质心(中心点)的距离的累加和后又把这多个簇(例k=3个)算出的值加起来得到一个新值,让这个新值最小。dist(c,x)的平方做2次累加求和(每个簇样本与质心距离之和,每个簇之和)取最小值(min)。

(2)kmeans工作流程

1)刚开始质心是随机初始化,那可能聚类效果不理想,那就要重新算出质心(均值)出来,再把每个样本计算出距离分到那一个簇中(距离最小就分到那边);

2)优劣点

<1>优点:简单快速,适合常规数据集

<2>劣点:参数k值难确定,初始k值确定很重要;复杂度与样本呈线性关系;很难发现任意形状的簇

(3)DBSCAN聚类算法

1)基本概念

<1>核心对象:若某个点的密度达到算法设定的阀值则其为核心点(即r领域内点的数量不小于minPts),实际算法中须指定半径r与minPts这二个值。

<2>a领域的距离阀值:设定的半径r值

<3>直接密度可达:若某点p在点q的r领域内,并且q是核心点,则p-q是直接密度可达。

<4>密度可达:它是有中间桥梁的,例如q1到q2是直接密度可达,q2与q3是直接密度可达,那么q1与q3就是密度可达。

<5>噪声点:不属于任何一个类簇的点,从任何一个核心点出发都是密度不可达。所以dbscan适合做异常检测任务

<6>边界点:属于某个类的非核心点,这个点不能发展下线了。每个点都会不断打圈发展下线的(有点类似传销)。

(4)DBSCAN工作流程

1)输入数据集,半径r,密度阀值minPts

九.Kmeans代码实现

十.聚类算法实验分析

十一.决策树原理

(1)决策树算法概述

决策树就是由多个if条件一层一层地判断,由上到下分层下去,但是if判断的先后顺序是很重要的(调整顺序也许会影响结果),一般大家都希望越前面的判断越重要(即越前面的判断要做对,过滤的方向要对,后面的判断就一步步微调即可)。

1)树模型

<1>决策树:从根节点开始一步一步走到叶子节点(决策)

<2>所有数据最终会落到叶子节点上,最终可做分类也可做回归。

2)树的组长

<1>根节点:第一个节点

<2>叶子节点:最终的决策结果

<3>非叶子节点与分支:中间过程

3)决策树的训练与测试

<1>训练阶段:从给定的训练集构造出一棵树(从根节点开始选择特征,如何进行特征切分,例age>18)。即从无到有构建出决策树出来。

<2>测试阶段:构建出来的树模型从上到下走一遍。

难点是如何构建决策树?这需要考虑的问题是很多的,没那么容易。

(2)熵的作用

1)如何切分特征(选择节点)

问题:根节点的选择该选择那个特征呢?选择好后如何切分?

想像下:根节点就像老大似的能更好地切分数据(分类的效果更好),根节点下面的节点自然就是二当家。

目标:通过一种衡量标准(例如用公式),来计算通过不同特征进行分支选择后的分类情况,找出最好的那个当作根节点,以此类推。

2)衡量标准--------熵

熵:熵是指随机变量不确定性的度量(衡量物体内容的混合程度,例杂货市场中的物品的混乱程度与专卖店的混乱程度是不同的)

熵的公式:H(X)=—((P i)*log (P i)的累加和),其中i是指1,2,3…n的个数。P i是指i元素对应的概率(每一个都会对有概率),别忘了最后前面是一个负号(相当取反),因为log (P i)会是负数,累加和也是负数,那前面加上负号就变成正数,所以负数值越大(绝对值越小时)加上负号后的熵值就越小,由对数log图像可知当概率(P i)接近1时熵值越小,即结论就是概率越大熵值越小,并且熵值都是大于0的,这个公式类似损失函数公式,都是熵值与损失值越小任务就越好(对应的概率越大)。

例子:集合A:{1,1,1,1,1,2,2,2},集合B:{1,2,3,4,5,6,7,8},按分类角度分析,集合A会更稳定,只二个分类就把它分开,它的熵值会更小,相反集合B就乱很多,熵值更大。本例中的A集合是二类,每类的概率P都是50%,而B的概率是1/8

(3)信息增益

不确定性越大,熵值越大。

信息增益:表示特征X使得类Y的不确定性减少的程度(分类后的专一性,希望分类后的结果是同类的分在一起),依据是熵值变化情况。

(4)决策树的构造实例

题目如下:

数据:14天的打球情况(总共14行5列,最后一列Y表示是否打球,Y是原始熵值)

特征:4种环境变化(相当于4个列属性,包括天气情况(晴天,阴天,雨天),温度,湿度,是否有风,分别是X1,X2,X3,X4表示)

目标:构造决策树

分析:要构造出这个决策树,首先就要确定根节点,而根节点的确定的依据是信息增益(即算4种不同特征X对Y不确定性减少程度,那就要先算出原始Y的熵值出来先,同时算出不同特征对应的熵算出来,然后分别减这个原始Y的熵值)。

解:1)Y的原始熵值为(对原始数据Y这一列算出熵值):在历史数据中有9天打球,5天不打球,所以它的熵值是—((9/14)*log 2  (9/14))+(—((5/14)*log 2  (5/14)))=0.940,其中这里是2为底的对数。

2)然后4个特征逐一算出熵来。例如按天气情况来得出熵的情况:<1>当天气是睛天时,对应的Y中有2天打球3天不打球,这时—((2/5)*log 2  (2/5))+(—((3/5)*log 2  (3/5)))=0.971;<2>当天气是阴天时,对应的Y中有4天打球0天不打球,这时它对应的值是—((4/4)*log 2  (4/4))+(—((0/4)*log 2  (0/4)))=0;<3>当天气是雨天时,对应的Y中有3天打球2天不打球,这时—((2/5)*log 2  (2/5))+(—((3/5)*log 2  (3/5)))=0.971,这三种情况的熵值都算出来了,但不是最终结果,我们要做加权后求和(不是直接求和),所以有(5/14)*0.971+(4/14)*0+(5/14)*0.971=0.693,这时得出的0.693就是按天气这特征算出来的熵值了。像4/14与5/14是指每个小类别下占的次数与总天数之比,相当于权重值。其它3种特征的熵值算法也是这样算。

3)信息增益:原始Y值熵由1)算出来是0.940,经过2)算出按天气特征算出的熵值是0.693,这时信息增益Z1=0.940-0.693=0.249,其它3种的信息增益也是这样算出来。这时取信息增益最大的那个特征当作根节点就可以了,其它节点也是类似的算法(被选的节点不用参与计算)。

(5)信息增益率与gini系数

1)信息增益不足:当某个特征很稀疏(例如id列)时,每个值都分得很清楚(每个类别内容很纯),这时这个特征加权累加后的熵是0,那信息增益就与原来Y一样,就会误认为这是最好的。

2)信息增益率:增加自身熵解决信息增益存在的问题,在上面14条打球的列表中增加14个不同值的id,那么就会分成14个情况,14个熵都是0,累加起来后熵值等以0,而上面算出的原始Y增益是0.940,所以假设信息增益值a=0.940-0=0.940;这时我们增加一个计算自身的熵(按整体来),它的自身熵是(—(1/14)*log 2  (1/14)*14=好大的一个值,假设这个值为b,而信息增益率公式=信息增益/自身熵=a/b=0.940/一个很大的值=很小的一个值。当然我们也是要取越大的来,即不管用信息增益还是信息增益率,信息增益与信息增益率都是取最大的来(现阶段主要用信息增益率)。

3)另外一种叫CART:使用GINI系数当作衡量标准。GINI(P)=(P k*(1-P k))的k个累加和=1-(P k)的平方后的累加和,其中P k是指第k个对应的概率值。GINI系数与熵值的衡量标准类似,只是计算方式不同。

(6)预剪枝方法

对于连续型的增益计算也是类似,只要先把数据排好,不断进行二分操作转成离散型来。

1)为什么要剪枝?决策树过拟合风险大,理论上可以完全分得开数据(想像成树很庞大,而且每个节点就一个数据),但这样就过拟合了。这种就类似用id进行来不断分解,分得层次深且叶子多,信息增益率很低。所以在构建决策树时就用剪枝来解决它,剪枝分成预剪枝和后剪枝二种。过拟合风险就如训练时效果很好,但一到测试时就不好。

2)预剪枝:边建立决策树,边进行剪枝操作(更实用)。预剪枝是通过限制树的深度,叶子节点个数,叶子节点的样本数,信息增益量等参数来实现。

3后剪枝:建立完决策树后再剪枝操作。叶子节点越多,损失越大。

(7)回归问题的解决

1)分类:决策树的最后的叶子节点中,按那一种类别占的样本最大就选那一种类别为这一分类,例一个节点中有8个样本是好学生,2个样本是坏学生,那这节点分类结果是好学生。

2)回归:回归不能用熵值来判断(因为它没有类别),但可用方差来判断到底选择那个方案(每种方案的全部左节点方差与全部右节点之和后进行比较,最后选出和最小的那种方案就是要选的)。方差是指数据的离散程度(数据间的差异程度)。

十二.决策树的代码实现

十三.决策树实验分析

(1)树模型可视化展示

1)先安装graphviz,然后配置path环境变量。

2)导入数据,做出X与Y来

3)实例化DecisionTreeClassifier(max_depth=2)决策树出来,假设tree

4)用决策树实例训练数据,tree.fit(X,Y)

5)画图展示,导入export_graphviz,把训练好的模型,标签,保存.dot文件路径传入到这个类中,这样就会生成dot文件了。

6)把dot文件转成jpg,png,pdf等。就是执行graphviz的命令转就行。

(2)决策边界展示分析

导入Image,然后用Image把刚才生成的png图像展示出来。和以前做法一样,先做数据,训练,棋盘,概率值,画等高线等步骤。

(3)树模型预剪枝参数作用

1)决策树中的正则化

DecisionTreeClassifier的几个重要参数在实例构建决策树时可不断实验调整,用来控制决策树的复杂度,防止过拟合,主要包括max_path(最大深度):

max_leaf_nodes(叶子节点的最大数):

max_features(在每个节点处评估用以拆分的最大特征数)

min_samples_split(节点在分割之前须貝有的最小样本数)

min_samples_leaf(叶子节点须貝有的最小样本数)

(4)回归树模型

十四.集成算法原理

一棵决策树比较单一,那加多一些树放一块就不单一了,多棵树融合在一起就变成随机森林。随机森林目的就是让机器学习得更好。它类似串联,并联电路。

(1)随机森林算法原理

它有如下三个分支:

1)bagging(随机森林):训练多个分类器取平均。f(x)=(1/m)*(f(x)从x为1到m个进行累加和)。它类似并联电路,树与树是无关的。特点:并行训练分类器。典型代表是随机森林,随机是采集的样本随机,特征选择也是随机的(这二个当作参数吧,可在sklean中指定这二个比例);森林就是很多棵决策树并行地放在一起,互不干扰。例如有3棵树组成的森林,按分类结果有2棵是A,1棵是B,那按分类器来说它的结果是少数服从多数的,所以最终结果是A;那若回归角度来看,1棵树是100分,另一棵是200分,最后一棵树是300分,那回归值就(100+200+300)/3=200,这个从回归角度来看它就是对应bagging的计算公式(即每个值之和后求平均)

2)boosting:从弱学习器中开始加强,通过加权来进行训练。它的思想是增加多一棵树比原来会好。它类似串联。

3)stacking:聚合多个分类和回归模型(可分阶段来做)

(2)随机森林优势与特征重要性指标

1)随机森林优势:<1>能处理很高维度(feature很多)的数据,会自动选择特征,不用自己指定选择特征。<2>训练完后,它能给出那些特征比较重要(加噪声点特征后,模型不变的情况下来比较err值大小来判断重要性)。<3>容易做成并行化方法,速度较快。<4>可进行可视化展示,便以分析。

2)特征重要性。假设有A,B,C,D四个特征建模,然后得到一个错误率err1,而当把B特征打乱换成B1(随意插入数值,相当于噪声点,起干扰目的),现在用A,B1,C,D这些特征建一样的模型,得到错误率为err2,如果err1约等以err2,那么说明对于这模型来说B特征影响不大,可有可无;如果err2远大于err1,那么说明对于这模型来说B特征影响很大,B特征重要性高。

(3)提升算法概述(boosting)

1)除了树模型,其它算法都不太适合做集成算法。

理论上树模型越多,随机森林效果会越好,但当达到一定数量时,效果就会达到顶了。

2)boosting:它的意思是在前面所有树预测的结果上加上一棵树,对标签值与预测值得到的差距值进行预测,而不是重新对刚开始的标签预测,加进来这棵树是指对原来预测结果上进行提升。例标签是1000,第一棵树预测出是900;那加多一棵树就是1000—900=100间预测,这时第二棵树得到50;现在又加多一棵树,这时前面2棵树当作一个整体,所以第三课树其实是1000—950=50进行预测了,假设第3棵结果是40,这时三棵树加起来就是900+50+40=990,这就是类似串联电路,这里不用算平均的噢。

十五.集成算法实验分析

十六.支持向量机(SVM)原理推导

支持向量机(SVM)是称霸机器学习算法很多年。SVM解决的就是经典的二分类问题,当然它也可做回归等等问题。支持向量机(SVM)是有监督算法。

(1)支持向量机要解决的问题

SVM重点解决的问题:1)什么样的决策边界才是最好的?选出最好的边界出来。2)特征数据本身就很难分,怎么办?也许转成高维就可分了。3)计算复杂度怎么样?升维后计算复杂度会升高。现对这三个问题推导。

1)决策边界:选出离雷区最远的边界,这样容错率会更高。这里的雷区是指边界上的点。何为最远呢?它是按距离来判断的,距离又是离某条边界最近点之间的距离。

(2)距离与数据定义

1)距离的计算

假设平面上存在二点x1与x2(x1与x2连成一条线),这里不管x1与x2是几维的,并且这二个点满足w1x1=-b,w1x2=-b构成的平面上(其中w1是法向量)。那我怎么算出某个点x到这个平面上的距离呢?思路是这样:先算x与x1的距离,然后把x与x1这条线投影映射到这个平面向,投影方向就是与法向量方向(垂直这个平面的)平行,点x到平面的距离就可用公式算出:distance(x,b,w)=|(w1/||w1||)*(x-x1)|,这里w1是指法向量,它除以||w1||模后会得到单位方向(即有方向了),有方向后再乘以(x-x1)距离就相当于把x投影到这个平面上的距离了,因为距离是正值,所以最后加个绝对值。对上式右边继续化简:distance(x,b,w)=|(w1/||w1||)*(x-x1)|=(1/||w1||)*|w1*x+b|。这样会得到多个直角三角形,不管斜边与另外一条边怎么变化,投影距离与方向都不会变(例也可以算出x-x2的距离来)。

2)数据标签定义

数据集:(X1,Y1),(X2,Y2),(Xn,Yn)

Y为样本类别:正样本假设用1表示,负样本用-1表示

决策方程:Y(X)=wX+b,这里的x是可1次方(线性),也可以是指多次方的。当Y(Xi)>0,则Yi=1;当Y(Xi)<0,则Yi=-1,相当于一个wX+b构成的平面分成2半。由这二个结果推出Yi*Y(Xi)>0,这里的i是指下标,表示第i个元素。

(3)目标函数推导

1)优化目标

最终目标:找到一条线(w与b),使得离该线最近的点(雷区)的距离最远。即找出离雷区(最接近线的某个雷)最远的线出来,最远最安全。

<1>将点到直线的距离化简(对上面(2)中的1)的公式继续化简)为:(Yi*(|wXi+b|))/||w||,由于Yi*Y(Xi)>0,所以把|wXi+b|中的绝对值去掉也恒成立。

2)目标函数

<1>放缩变换

对于决策方程(w与b)可通过放缩使得其结果值|Y|>=1>=Yi*(|wXi+b|)>=1(由大于0升为大于等以1)

<2>优化目标是arg  max{(1/||w||)*min[Yi*(|wXi+b|)]},这个目标就是说什么样的w与b值使离直线最近的点到这条线最远?这里把常数项1/||w||先提取出来到外面了,由于<1>中可知Yi*(|wXi+b|)>=1(这个条件须要满足),所以只需考虑arg  max(1/||w||)即可,目标函数也就搞定了。别被大长的数学公式吓到,分析数学公式一般都是先从里面看起,分析起来。

(4)拉格朗日乘子法

1)首先当前目标:Yi*(|wXi+b|)>=1(这个条件须要满足),arg  max(1/||w||)最大值时w与b的取值。

2)常规套路:求最大值问题转换成求最小值问题。即变成求min (1/2)*w的平方,这里的w不是一个数,是矩阵来的,是向量;1/2是常数项,对结果不受影响,可换成其它也一样的。

3)如何求解:用拉格朗日乘子法求解,因为在指定条件下求极值问题通常用拉格朗日乘子法。拉格朗日乘子法公式比较复杂,其实这公式的思想是转成求某个变量的解代替原来几个变量解(例用a代替w与b,其中a要与w,b有关系)。偏导为0时就可得到极值,所以分别对w与b求偏导即可。

(5)化简最终目标函数

数学公式比较复杂

(6)求决策方程

数学公式比较复杂

(7)软间隔优化

a不为0的边界点就是到某直线上最远的点。

1)软间隔:由于数据中有时候有一些噪声点,如果都考虑这些噪声点(过拟合),咱们的线就不大好了(即使能分开,也许距离不是最远了)。为了解决这问题,引入了松驰因子:原来条件是Yi*(w*Xi+b)>=1,现在引入一个松驰因子g,则公式变成:Yi*(w*Xi+b)>=1-g,当g=0时和原来一样,当g大一点,容错大一点。

2)在svm实际应用中,要指定一个C参数,这个C参数值越大时,g就只能越小,容错方面就很小;相反C参数值越小时,g就可变得大一点,容错方面就会变大,间隔可大点。

(8)核函数的作用

见线性代数的核函数内容。svm中特征升维(低维升高维后通常就可分了)后计算它们的内积会很复杂,所以就用核函数来解决这计算问题,常用的核函数是高斯核函数(非性线),线性核函数等。

十七.支持向量机(SVM)实验分析

十八.神经网络算法原理

(1)深度学习要解决的问题

1)机器学习流程:数据获取——>特征工程——>用算法建立模型——>评估与应用。这里很关键一步是特征工程。

2)以前运用机器学习算法中,我们拿到数据进行处理后,要自己人为地思考这样的问题:什么特征拿出来用?这些特征怎么组合?把数据怎么做各种变换得到更有价值的数据作为输入?那有没有一种算法对拿到一份数据后就自动会选出有用特征出来,自动学习一下把好特征怎么相互组合在一起,怎么自动合适地分解特征,怎么自动地合适地融合特征在一起,这就出现深度学习来解决了。假设把人工智能分成人工与智能二部分,机器学习就算是人工这部分,而深度学习就是智能部分。深度学习在拿到数据后会用网络自动去学习,把特征工程做好。

3)神经网络的特征工程作用

<1>数据特征决定了模型的上限

<2>预处理与特征提取是核心,机器学习的特征提取是难点(特别对于图像,文本数据,自然语言的特征提取),所以就出现流行的深度学习

<3>算法与参数选择决定了如何逼近这个上限

(2)深度学习应用领域

有监督学习中,标注很重要。

(3)计算机视觉任务

1)图像在计算机中就是一个矩阵,矩阵是由很多数字表示的;一张图片被表示为三维数组(3维矩阵)的形式,每个像素点的值从0到255,矩阵中包括很多个像素点,像素点的值越小会越暗。一张图片表示例如为300*100*3,其中300表示h,100表示w,3表示红绿蓝(RGB)三通道数。通常格式是hwc。

2)计算机视觉面临的挑战

1)部分庶挡

2)背景混入

(4)视觉任务中碰到的问题

背景做成主体,前景(物体主体)被忽略掉。

(5)得分函数(线性函数)

可看人工智能深度学习必备核心算法之一神经网络,剩下的神经网络内容都看这个。

二十七.主成分分析(PCA)降维算法原理解读

(1)PCA基本概念

1)线性判别分析(LDA)降维是基于有监督的,而PCA是可基于无监督的。

用途:降维中最常用的一种手段。

目标:提取最有价值的信(基于方差)。提取后的方差越大越好,分得越开。

问题:降维后数据的意义。PCA不考虑意义,只做降维。

2)向量的表示和基的变换

<1>内积:(A1,A2,A3,…An)*(B1,B2,B3,…Bn)=A1B1+A2B2+A3B3+…AnBn

<2>内积解释:A*B=|A|*|B|*cos(a);设向量B的模为1,则A与B的内积的值等以A向B所在直线投影的矢量长度。可以在平面上表示出来。

<3>例向量表示为(3,2),它实际上是线性组合x(1,0)+y(0,1),其中(1,0)与(0,1)叫做二维空间的一组基。坐标基是可做旋转,伸缩变换的,当基发生变换,原来的某点的坐标值也会发生变化。

<4>基的变换

1>基是正交的,在平面上是相互垂直的(例x轴与y轴),基的内积是0,就如(1,0)与(0,1)的内积是1*0+0*1=0

2>基是线性无关的。相互垂直时,x与y不能相互表示,例x不能用y表示,y也不能用x代替。因为它们夹角90度时,cos90=0,依内积公式A*B=|A|*|B|*cos(a)=0;如果夹角不为90,它们就可以相互映射到对方。

3>基变换:数据与一个基做内积运算,结果作为第一个新的坐标分量;然后与第二个基做内积运算,得到第二个新的坐标分量。

例:2行2列的基

(1     0 

 0      1)乘上2行1列的数据

(3   

 2)等以2行1列的值,当基不同数据还是一样的化,相当基坐标发生变化,那么内积出来的结果还是2行1列,但值(在新基中数据表示的原坐标,例(3,2)这值在新基中会不同了)会发生变化了。如果是多维的话,也是一样这样做内积乘法。

两个矩阵相乘是指右边矩阵的每一列的列向量(原数据)变换到左边矩阵的每一行的行向量为基所表示的空间中去。即数据到基的坐标映射。

(2)方差与协方差

1)协方差矩阵

<1>方向:如何选择一个方向(或说是一个基)才能尽量保留最多的原始信息呢?一个直观的看法:希望投影后的投影值尽可能分散,方差越大越分散。

<2>方差:Var(A)=(1/m)*((A i-u)的平方后求累加和),其中i是从1到m,u是数学期望(均值)

寻找一个一堆基,使所有数据变换成这个基上的坐标表示后,方差值最大。

<3>协方差:假设均值为零时的方差。Cov(A,B)=(1/m)*(((A i)*(B i))的累加和),其中i是从1到m,这里是没有均值u的了,因为均值为0。协方差用来表达数据之间的相关程度,例A i与B i两特征之间的相关性就可用计算协方差来判断。假设均值不为0,公式就变成Cov(A,B)=(1/m)*(((A i-u)*(B i-u))的累加和。

<4>协方差特点:有正也有负的情况

<5>如果只是单纯选择方差最大的方向,那后续方向应与方差最大的方向重合,重合的话就变成类似线性相关(我们不希望x值可用y来表示)了,不能达到尽量保留最多的原始信息的目的。所以方差达不到这目的,所以就引入了协方差,协方差可以表示两个字段(特征)的相关性。

<6>当协方差为0时,表示两个字段(特征)完全独立。为了使协方差为0,在选择第二个基时只能在与第一个基正交的方向上选择(x,y,z轴组成的三维)。因此最终选择的二个方向一定是正交的(线性无关)

<7>综上所述:在协方差为0的情况下(线性无关),让方差越大越好(分得越开)

(3)PCB结果推导

1)优化目标

将一组N维向量降为K维(K大于0小于N),目标是选择K个单位正交基,使原始数据变换到这组基上后,各字段(特征)两两之间的协方差为0,字段的方差尽可能大。

2)协方差矩阵=(1/m)*X*X的转置,其中X表示矩阵(原始数据),m表示矩阵有m个列(字段或叫特征),假设X是由A与B组成的2行m列矩阵。

3)继续上面2)中公式,假设均值为0的情况下,协方差矩阵结果中主对角线的两个元素分别是两个字段的方差,而其它元素是每二个字段之间的协方差。所以说现在目标就是协方差矩阵主对角线的方差值最大,而非主对角线的其它所有元素值都为0。

4)协方差矩阵对角化:除对角线外的其它元素都为0,并且在对角线上按元素从大到小排列,用PCP的转置表示协方差矩阵对角化,这里的P是指做了归一化后的特征向量,C是指协方差矩阵。

5)实对称矩阵:一个n行n列的实对称矩阵一定能找到n个单位正交特征向量。

最终目标是先算出协方差矩阵(即上面的2)与3)),然后做协方差矩阵对角化(目的把特征向量在对角线上从大到小排序),再然后从这协方差矩阵对角化中取前k个(假设总共有n个)做为新矩阵W,最后用W乘以原始数据X就得到降维后的新矩阵(这里假设用Y表示),所以W*X=Y

(4)PCB降维实例

1)协方差矩阵算出来后,就可算出特征值与特征向量了(通常一个特征值比较大,那么对应的特征向量是比较重要些的),然后对特征向量做归一化就得到P)

2)特征值与特征向量是可直接调用生成,一般有几个特征就会有几个特征值,特征值会需与特征向量对应上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501857.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器迁移中心——“工作组迁移”使用指南

简介 服务器迁移中心&#xff08;Server Migration Center&#xff0c;简称SMC&#xff09;是阿里云提供给您的迁移平台。专注于提供能力普惠、体验一致、效率至上的迁移服务&#xff0c;满足您在阿里云的迁移需求。 工作组迁移是SMC的一项功能&#xff0c;提供标准化迁移流程…

C#调用Lua

目录 xLua导入 打包工具导入 单例基类导入与AB包管理器导入 Lua解析器 文件加载与重定向 Lua解析器管理器 全局变量获取 全局函数获取 对于无参数无返回值 对于有参数有返回值 对于多返回值 对于变长参数 完整代码 List与Dictionary映射Table 类映射Table 接口映射…

Wend看源码-Java-fork/Join并行执行任务框架学习

摘要 本文主要介绍了Java的Fork/Join并行任务执行框架&#xff0c;详细阐述了其工作原理和核心构件&#xff0c;全面解读了Fork/Join框架的运作机制&#xff0c;旨在为学习这一框架的开发者提供一份详实且实用的参考资料。 Java的Fork/Join框架是Java 7引入的一个用于并行执行任…

C++ 中 Unicode 字符串的宽度

首先&#xff0c;什么是 Unicode&#xff1f; Unicode 实际上是一个统一的文字编码标准&#xff0c;它出现目的是为了解决不同计算机之间字符编码不同而导致的灾难性不兼容问题。 Unicode 字符集与 Unicode 编码是两种不同的概念。Unicode 字符集实际是对进入标准的所有文字用…

Python爬虫 - 豆瓣图书数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的单个图书信息1.2 爬取步骤1.2.1 爬取豆瓣图书标签分类页面1.2.2 爬取分类页面1.2.3 爬取单个图书页面 1.3 内容所在的标签定位 2. 数据用途2.1 基础分析2.2 高级分析 3. 应对反爬机制的策略3.1 使用 …

MIPI_DPU 综合(DPU+MIPI+Demosaic+VDMA 通路)

目录 1. 简介 2. 创建 Platform 2.1 Block Design 2.1.1 DPU PFM Lite 2.1.2 DPU prj 2.1.3 DPU MIPI Platform 2.2 pin 约束 2.2.1 GPIO 约束 2.2.2 IIC 约束 2.1.3 DPHY 约束 3. 报错总结 3.1 AXI_M 必须顺序引用 3.2 DPU 地址分配错误 4. Design Example 4.…

Spring系列一:spring的安装与使用

文章目录 ?? 官方资料 ??Spring5下载??文档介绍 ??Spring5 ??内容介绍??重要概念 ??快速入门 ??Spring操作演示??类加载路径??Spring容器结构剖析??Debug配置 ??实现简单基于XML配置程序 ??Spring原生容器结构梳理??作业布置??Spring课堂练习 …

AutoSar架构学习笔记

1.AUTOSAR&#xff08;Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff09;是一个针对汽车行业的软件架构标准&#xff0c;旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元&#xff08;ECU&#xf…

Kernel Stack栈溢出攻击及保护绕过

前言 本文介绍Linux内核的栈溢出攻击&#xff0c;和内核一些保护的绕过手法&#xff0c;通过一道内核题及其变体从浅入深一步步走进kernel世界。 QWB_2018_core 题目分析 start.sh qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./core.cpio \-append "…

【顶刊TPAMI 2025】多头编码(MHE)之Part 6:极限分类无需预处理

目录 1 标签分解方法的消融研究2 标签分解对泛化的影响3 讨论4 结论 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者&#xff1a;Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位&#xff1a;山东大学 代码&#xff1a;https:…

友元和运算符重载

1. 友元 可以把某些选定的函数看作类的“荣誉函数”&#xff0c;允许它们访问类对象中非公共的成员&#xff0c;就好像它们是类的成员一样&#xff0c;这种函数称为类的友元。友元可以访问类对象的任意成员。 1.1 友元函数 友元函数是一种定义在类外部的普通函数&#xff0…

Git 树形图表不显示问题

注册表修改 ## 注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 生效 右键重启 windows资源管理器

【MySQL基础篇】三、表结构的操作

文章目录 Ⅰ. 创建表1、语法2、创建表样例3、创建和其它表一样结构的表 Ⅱ. 查看表结构1、查看数据库中的表2、查看指定表的属性3、获取表的创建语句 Ⅲ. 删除表Ⅳ. 修改表结构1、向表中插入新的字段2、删除表中的字段3、修改表名4、修改字段属性 Ⅰ. 创建表 1、语法 create …

aws(学习笔记第二十二课) 复杂的lambda应用程序(python zip打包)

aws(学习笔记第二十二课) 开发复杂的lambda应用程序(python的zip包) 学习内容&#xff1a; 练习使用CloudShell开发复杂lambda应用程序(python) 1. 练习使用CloudShell CloudShell使用背景 复杂的python的lambda程序会有许多依赖的包&#xff0c;如果不提前准备好这些python的…

SAP SD销售模块常见BAPI函数

【SAP系统研究】 #SAP #SD #销售管理 1、销售订单 BAPI_SALESORDER_CREATEFROMDAT2 创建销售订单 BAPI_CUSTOMERRETURN_CREATE 创建退货订单 SD_SALESDOCUMENT_CREATE 创建贷项订单 BAPI_SALESORDER_CHANGE 修改销售订单 STATUS_READ 查看销售订单状态VB销售订单000000 I_CHA…

CSS学习记录21

CSS 工具提示 通过CSS 创建工具提示&#xff08;Tooltip)。 当用户将鼠标指针移动到元素上时&#xff0c;工具提示通常用于提供关于某内容的额外信息&#xff1a; <style> /* Tooltip 容器 */ .tooltip {position: relative;display: inline-block;border-bottom: 1px …

DuckDB:密钥管理器及其应用

密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围&#xff0c;因此不同的存储前缀可以有不同的密钥信息&#xff0c;例如允许在单个查询中连接跨组织的数据。密钥也可以持久化&#xff0c;这样就不需要在每次启动DuckDB时都指定它…

[cg] android studio 无法调试cpp问题

折腾了好久&#xff0c;native cpp库无法调试问题&#xff0c;原因 下面的Deploy 需要选Apk from app bundle!! 另外就是指定Debug type为Dual&#xff0c;并在Symbol Directories 指定native cpp的so路径 UE项目调试&#xff1a; 使用Android Studio调试虚幻引擎Android项目…

uni-app深度解码:跨平台APP开发的核心引擎与创新实践

在当今数字化浪潮中&#xff0c;移动应用市场呈现出爆炸式增长。为了满足不同用户群体在不同操作系统上的需求&#xff0c;跨平台 APP 开发成为众多开发者的首选策略。uni-app 作为一款领先的跨平台开发框架&#xff0c;以其独特的优势和创新的实践在众多同类产品中脱颖而出。它…

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…