当前位置: 首页 > news >正文

人工智能之机器学习算法

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

一.线性回归原理推导

(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)特征值与特征向量是可直接调用生成,一般有几个特征就会有几个特征值,特征值会需与特征向量对应上。

相关文章:

人工智能之机器学习算法

所有的机器学习算法都是要优化的&#xff0c;优化的必要条件是确定优化的目标函数(损失函数)&#xff0c;目标函数是根据实际问题(数据)转成的数学公式。 一.线性回归原理推导 &#xff08;1&#xff09;回归问题概述 在机器学习的有监督算法中&#xff0c;分类与回归二种情…...

17爬虫:关于DrissionPage相关内容的学习01

概述 前面我们已经大致了解了selenium的用法&#xff0c;DerssionPage同selenium一样&#xff0c;也是一个基于Python的网页自动化工具。 DrissionPage既可以实现网页的自动化操作&#xff0c;也能够实现收发数据包&#xff0c;也可以把两者的功能合二为一。 DressionPage的…...

Ubuntu如何安装jdk并切换到不同的jdk版本

参考:https://www.cnblogs.com/Jakson/articles/4615768.html 摘要 &#xff1a;因为ubuntu 会自带open-jdk预装在系统内,当我们需要在 ubuntu下 安装jdk 的时候 ,发现 即使配置好环境变量后 输入 java -version 版本还是依然没有发生变化,我们需要以下2个步骤切换/usr/local/…...

Python基础语法(上)

目录 一、print函数及常量表达式 1.print函数 2.常量表达式 二、变量 1.定义变量的规则 2.python的动态类型特性 3.字符串 三、注释 四、input函数 1.input函数 2.变量类型转换 五、运算符 1.算数运算符 2.关系运算符 &#xff08;1&#xff09;整形的比较 &am…...

k8s系列--docker拉取镜像导入k8s的containerd中

# 确认一下当前集群中正在运行的 Pod 和命名空间 kubectl get pods -A# 示例一&#xff1a;拉取并导入 CoreDNS 镜像 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1 docker save registry.cn-hangzhou.aliyuncs.com/google_containers/cor…...

深入理解 Android 中的 ComponentInfo

深入理解 Android 中的 ComponentInfo 在 Android 开发中&#xff0c;ComponentInfo 是一个非常重要的类&#xff0c;它用于描述应用程序中的组件信息&#xff0c;包括 Activity、Service、BroadcastReceiver 和 ContentProvider。理解 ComponentInfo 的结构和使用方式&#x…...

阿里云 ECS 服务器绑定多个公网IP

阿里云 ECS 服务器绑定多个公网IP 一、弹性公网IP绑定ECS服务器 单台ECS一般只能直接绑定一个弹性公网IP&#xff0c;但是可以绑定多张弹性网卡&#xff0c;如果把弹性公网IP绑定到弹性网卡上&#xff0c;那么单台ECS就能间接绑定多个弹性公网IP。但有的服务器系统镜像可能不…...

模块化通讯管理机在物联网系统中的应用

安科瑞刘鸿鹏 摘要 随着能源结构转型和智能化电网的推进&#xff0c;电力物联网逐渐成为智能电网的重要组成部分。本文以安科瑞ANet系列智能通信管理机为例&#xff0c;探讨其在电力物联网中的应用&#xff0c;包括数据采集、规约转换、边缘计算、远程控制等技术实践&#…...

Kafka Offset explorer使用

Kafka集群配置好以后以后运维这边先用工具测试一下&#xff0c;便于rd展开后续的工作&#xff0c;本地调试时一般使用Offset explorer工具进行连接 使用SASL(Simple Authentication and Security Layer)验证方式 使用SCRAM-SHA-256(Salted Challenge Response Authentication…...

小程序学习07—— uniapp组件通信props和$emit和插槽语法

目录 一 父组件向子组件传递消息 1.1 props &#xff08;a&#xff09;传递静态或动态的 Prop &#xff08;b&#xff09;单向数据流 二 子组件通知父组件 2.1 $emit &#xff08;a&#xff09;定义自定义事件 &#xff08;b&#xff09;绑定自定义事件 三 插槽语法…...

行为模式1.模板方法模式

行为型模式 模板方法模式&#xff08;Template Method Pattern&#xff09;命令模式&#xff08;Command Pattern&#xff09;迭代器模式&#xff08;Iterator Pattern&#xff09;观察者模式&#xff08;Observer Pattern&#xff09;中介者模式&#xff08;Mediator Pattern…...

【模型】Qwen2-VL 服务端UI

1. 前言 最近在测试VLM模型&#xff0c;发现官方的网页demo&#xff0c;代码中视频与图片分辨率可能由于高并发设置的很小&#xff0c;导致达不到预期效果&#xff0c;于是自己研究了一下&#xff0c;搞了一个简单的前端部署&#xff0c;自己在服务器部署了下UI界面&#xff0…...

ImageNet 2.0?自动驾驶数据集迎来自动标注新时代

引言&#xff1a; 3DGS因其渲染速度快和高质量的新视角合成而备受关注。一些研究人员尝试将3DGS应用于驾驶场景的重建。然而&#xff0c;这些方法通常依赖于多种数据类型&#xff0c;如深度图、3D框和移动物体的轨迹。此外&#xff0c;合成图像缺乏标注也限制了其在下游任务中的…...

京东一面:MySQL 主备延迟有哪些坑?主备切换策略

作为一名开发同学&#xff0c;大家对 MySQL 一定不陌生&#xff0c;像常见的 事务特性、隔离级别 、索引等也都是老生常谈。 今天&#xff0c;我们就来聊个深度话题&#xff0c;关于 MySQL 的 高可用 一、什么是高可用&#xff1f; 维基百科定义&#xff1a; 高可用性&#x…...

Linux(Ubuntu24.04)安装Eigen3库

本次安装Eigen3是在WSL2的Ubuntu24.04环境下进行。 Eigen3是一个C模板库&#xff0c;用于线性代数、矩阵运算和数值计算。它提供了一组高性能的矩阵和向量操作&#xff0c;以及常用的线性代数算法&#xff0c;如矩阵分解、特征值求解和最小二乘解等。 1、安装Eigen3 有两种安…...

ABP框架8——仓储的作用及其基础Demo

一、使用仓储的好处 1.提高CRUD接口复用性2.解耦业务逻辑&#xff08;BLL&#xff09;和增删改查&#xff08;CRUD&#xff09;&#xff0c;换ORM特别方便&#xff0c;不需要改应用层&#xff0c;直接改仓储层3.做复杂查询4.事务支持 二、Demo public class BookRepository …...

【Multisim用74ls92和90做六十进制】2022-6-12

缘由Multisim如何用74ls92和90做六十进制-其他-CSDN问答 74LS92、74LS90参考...

利用KPaaS平台提升企业审批流程的透明度

企业的审批流程不仅影响决策效率&#xff0c;还直接关联到组织的透明度和运营效果。传统的审批流程通常由多个环节和系统构成&#xff0c;每一个环节都可能存在信息不对称的现象。例如&#xff0c;某一审批节点的负责人可能并不清楚当前的审批状态&#xff0c;而在其他环节&…...

Python 数据可视化的完整指南

目录 一、为什么选择 Python 进行数据可视化? 二、常用 Python 可视化库及其特点 三、常用图表类型及其代码示例 折线图:用于展示数据随时间或其他连续变量的变化趋势。 柱状图:用于比较不同类别的数据大小。 散点图:用于展示两个变量之间的关系,并发现数据中的模式…...

ZYNQ初识7(zynq_7010)RAM_IP核

学习汇总正点原子bi站教学视频。但由于目前的学习板PL端缺乏时钟晶振&#xff0c;所以需要从PS端调用时钟供给PL端使用&#xff0c;也就造成顶层文件的设置出现一些问题&#xff0c;在IP核创建调用和例化过程中一些功能会受到限制&#xff0c;所以以下仅作汇总参考。 zynq_7000…...

.e01, ..., .e0n的分卷压缩包怎么解压

用BandiZip&#xff0c;这些分卷压缩中还有一个.exe的文件&#xff0c;这个不是可执行文件&#xff0c;是一个解压缩的开头。 安装好bandiZip后&#xff0c;右键这个.exe文件 点击打开就是开始解压了&#xff1a; 最后解压后是这些。然后一个个再次解压....

linux网络管理

网络配置文件 网卡信息文件 :::color3 /etc/sysconfig/network-scripts ::: 配置描述DEVICE网卡设备名-必填BOOTPROTO必填&#xff1a;none,static(静态 IP),dhcp(动态 IP)HWADDRMAC 地址NM_CONTROLLED是否启用Network Manager图形管理工具&#xff0c;建议 noONBOOT是否默认…...

宽带、光猫、路由器、WiFi、光纤之间的关系

1、宽带&#xff08;Broadband&#xff09; 1.1 宽带的定义宽带指的是一种高速互联网接入技术&#xff0c;通常包括ADSL、光纤、4G/5G等不同类型的接入方式。宽带的关键特点是能够提供较高的数据传输速率&#xff0c;使得用户可以享受到稳定的上网体验。 1.2 宽带的作用宽带是…...

Momentum Contrast for Unsupervised Visual Representation Learning论文笔记

文章目录 论文地址动量队列对比学习的infoNCE loss为什么需要动量编码器对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同为什么动量编码器和梯度编码器不能完全相同&#xff1f;总结&#xff1a; 我理解&#xff0c;正负样本应该经过同一个encoder&#xff0c…...

linux-26 文件管理(四)install

说一个命令&#xff0c;叫install&#xff0c;man install&#xff0c;install是什么意思&#xff1f;安装&#xff0c;install表示安装的意思&#xff0c;那你猜install是用来干什么的&#xff1f;猜一猜干什么的&#xff1f;安装软件&#xff0c;安装第三方软件&#xff0c;错…...

day-104 组合总和 Ⅳ

思路 动态规划 解题过程 假设dfs(target)表示组成target的组合数&#xff0c;可得转换方程dfs(target)dfs(target-nums[0])dfs(target-nums[1])…以此类推 注意&#xff1a;nums[i]需要小于等于当前的target Code class Solution {public int combinationSum4(int[] nums, i…...

Gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置

gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置 1. 说明2. 实操&#xff08;以docker执行器为例&#xff09;2.1 修改默认的builds_dir2.1.1 调整gitlab-runner的配置文件2.1.2 CI文件 2.2 启用custom_build_dir2.2.1 调整gitlab-runner的配置文件2.2.2 CI文件…...

代码随想录算法训练营day21

代码随想录算法训练营 —day21 文章目录 代码随想录算法训练营前言一、669. 修剪二叉搜索树递归法迭代法 二、108.将有序数组转换为二叉搜索树递归法迭代法 三、538.把二叉搜索树转换为累加树递归法 总结 前言 今天是算法营的第21天&#xff0c;希望自己能够坚持下来&#xf…...

苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序

前言 苹果系统下使用opencv感觉还是有些不太方便&#xff0c;总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型&#xff1a; 选择界面模式和编程语言&#xff1a; 其余…...

滴滴工作流引擎Turbo与logicFlow研究

目录 logicFlow turbo 工作流引擎很多,也都提供了前端UI库,但是太过于冗杂了,元数据表都几十个,logincFlow和Turbo的组合提供了轻量化方式,turbo后端代码只有5个元数据表,logicFlow也提供了bpm的相关扩展功能,但缺点是turbo社区不活跃,logicFlow个人认为跟echarts这种…...

快速将索尼手机联系人导出为 HTML 文件

我想将 Sony Xperia 手机上的联系人导出到计算机上进行备份&#xff0c;并在需要时进行编辑。这可以做到吗&#xff1f;如何做到&#xff1f;作为助手我需要下载什么工具吗&#xff1f; 当您的 Android 手机上存储了如此多的重要联系人&#xff0c;而您又不想丢失它们时&#…...

长时间序列预测算法---Informer

目录 一、传统的 Transformer 模型二、Informer原理2.1 Attention计算2.2 “积极”的Q筛选2.2.1 KL散度2.2.2 “懒惰”的q处理 2.3 Encoder结构2.4 Decoder结构2.4.1 Transformer的Decoder操作2.4.2 Informer的Decoder操作 2.5 Informer模型的改进 三、模型应用 时间序列相关参…...

深入理解连接池:从数据库到HTTP的优化之道

在现代应用开发中&#xff0c;高效的资源管理是关键&#xff0c;其中连接池&#xff08;Connection Pool&#xff09;技术起到了至关重要的作用。本文将带你深入了解连接池的概念及其在数据库和HTTP通信中的应用&#xff0c;结合 JDBC 与 Druid 的关系&#xff0c;以及 HttpURL…...

LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作

近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展突飞猛进&#xff0c;逐步缩小了与通用人工智能&#xff08;AGI&#xff09;的差距。DeepSeek-AI 团队最新发布的 DeepSeek-V3&#xff0c;作为一款强大的混合专家模型&#xff08;Mixture-of-Experts, MoE&a…...

IIS设置IP+端口号外网无法访问的解决方案

在IIS将站点设置为IP端口访问&#xff0c;假设端口为8080&#xff0c;设好后&#xff0c;服务器上可以访问&#xff0c;外网无法访问。 通常是端口8080没有加入【入站规则】的缘故&#xff0c;将8080端口加入【入站规则】即可&#xff0c;操作如下&#xff1a; 一、ctrlr 输入 …...

Leetcode 最大正方形

java 实现 class Solution {public int maximalSquare(char[][] matrix) {//处理特殊情况if(matrix null || matrix.length 0 || matrix[0].length 0) return 0;int rows matrix.length;int cols matrix[0].length;int[][] dp new int[rows][cols]; //dp[i][j]的含义是以…...

数据结构与算法之动态规划: LeetCode 3105. 最长的严格递增或递减子数组 (Ts版)

最长的严格递增或递减子数组 https://leetcode.cn/problems/longest-strictly-increasing-or-strictly-decreasing-subarray/description/ 描述 给你一个整数数组 nums返回数组 nums 中 严格递增 或 严格递减的最长非空子数组的长度 示例 1 输入&#xff1a;nums [1,4,3,…...

【书籍连载】《软件测试架构实践与精准测试》| 有关软件测试模型的调查结果

各位软件领域的精英们&#xff0c;今天小编邀请你继续深入学习《软件测试架构实践与精准测试》。 《软件测试架构实践与精准测试》是作者李龙&#xff08;安畅检测首席技术专家&#xff09;基于软件测试“川模型”的著作。本书结合作者首次提出的软件测试新的模型“川模型”测试…...

我的博客年度之旅:感恩、成长与展望

目录 感恩有你 技能满点 新年新征程 嘿&#xff0c;各位技术大佬、数码潮咖还有屏幕前超爱学习的小伙伴们&#xff01;当新年的钟声即将敲响&#xff0c;我们站在时光的交汇点上&#xff0c;回首过往&#xff0c;满心感慨&#xff1b;展望未来&#xff0c;豪情满怀。过去的这…...

【RTD MCAL 篇3】 K312 MCU时钟系统配置

【RTD MCAL 篇3】 K312 MCU时钟系统配置 一&#xff0c;文档简介二&#xff0c; 时钟系统理论与配置2.1 K312 时钟系统2.1.1 PLL2.1.2 MUX_0系统2.1.3 MUX_6 时钟输出2.1.4 option B推荐方案 2.2 EB 配置2.2.1 General 配置2.2.2 McuClockSettingConfig配置2.2.2.1 McuFIRC配置…...

力扣28找出字符串中第一个匹配项的下标

class Solution:def strStr(self, haystack: str, needle: str) -> int:# 特殊情况处理if not needle:return 0# 获取 haystack 和 needle 的长度a len(needle)b len(haystack)# 遍历 haystack&#xff0c;检查每个子字符串是否与 needle 匹配for i in range(b - a 1):if…...

[C#]C# random.Next(0,1)包含0和1吗

在C#中&#xff0c;Random.Next(minValue, maxValue) 方法生成的随机数是一个在 minValue&#xff08;包含&#xff09;和 maxValue&#xff08;不包含&#xff09;之间的整数。因此&#xff0c;当你调用 Random.Next(0, 1) 时&#xff0c;它只会生成一个整数&#xff0c;这个整…...

【设计模式】 基本原则、设计模式分类

设计模式 设计模式是软件工程中的一种通用术语&#xff0c;指的是针对特定问题的经过实践验证的解决方案。设计模式并不是最终的代码实现&#xff0c;而是描述了如何解决某一类问题的思路和方法。 如果熟悉了设计模式&#xff0c;当遇到类似的场景&#xff0c;我们可以快速地…...

Swift White Hawkstrider

Swift White Hawkstrider 迅捷白色陆行鸟 Swift White Hawkstrider - Item - 魔兽世界怀旧服TBC数据库_WOW2.43数据库_70级《燃烧的远征》数据库 Kaelthas Sunstrider (1) <Lord of the Blood Elves> 凯尔萨斯逐日者. 掉落 [80圣骑士][Alonsus-加丁][诺森德冒险补给品…...

node.js下载、安装、设置国内镜像源(永久)(Windows11)

目录 node-v20.18.0-x64 工具下载安装设置国内镜像源&#xff08;永久&#xff09; node-v20.18.0-x64 工具 系统&#xff1a;Windows 11 下载 官网https://nodejs.org/zh-cn/download/package-manager 版本我是跟着老师选的node-v20.18.0-x64如图选择 Windows、x64、v2…...

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构&#xff0c;我们将创建一个动态购物车&#xff0c;支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…...

df.groupby(pd.Grouper(level=1)).sum()

df.groupby(pd.Grouper(level1)).sum() 在 Python 中的作用是根据 DataFrame 的某一索引级别进行分组&#xff0c;并计算每个分组的总和。具体来说&#xff1a; df.groupby(...)&#xff1a;这是 pandas 的分组操作&#xff0c;按照指定的规则将 DataFrame 分组。 pd.Grouper(…...

【网络安全 | 漏洞挖掘】绕过电子邮件确认实现预账户接管

未经许可,不得转载。 文章目录 正文漏洞步骤赏金正文 我测试的应用程序有多个子域名: 1、account.example.com:处理用户账户管理。 2、project.example.com:管理用户拥有或被邀请的项目。 3、org.example.com:一个新的子域,用于管理多个项目的组织。 4、collaborator.ex…...

【SpringBoot教程】SpringBoot整合Mybatis - 前后端分离项目 - vue3

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张将通过一个完整的前后端分离的任务来介绍SpringBoot整合Mybatis过程&#xff01; 文章目录 1.前言1.1 任务描述1.2 SpringBoot整合Mybatis概述1.3 完整项目…...

node.js之---事件驱动编程

详解事件驱动 事件驱动是基于什么实现的 事件驱动和I/O操作的关系 I/O操作和事件循环的关系 详解事件驱动 事件驱动编程&#xff08;Event-driven Programming&#xff09;是一种编程范式&#xff0c;其中程序的控制流是由“事件”驱动的。事件通常指的是用户操作、网络请…...