人工智能之机器学习算法
所有的机器学习算法都是要优化的,优化的必要条件是确定优化的目标函数(损失函数),目标函数是根据实际问题(数据)转成的数学公式。
一.线性回归原理推导
(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)特征值与特征向量是可直接调用生成,一般有几个特征就会有几个特征值,特征值会需与特征向量对应上。
相关文章:

人工智能之机器学习算法
所有的机器学习算法都是要优化的,优化的必要条件是确定优化的目标函数(损失函数),目标函数是根据实际问题(数据)转成的数学公式。 一.线性回归原理推导 (1)回归问题概述 在机器学习的有监督算法中,分类与回归二种情…...
Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin
Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin 通常,如果要把一个相对布局,FrameLayout,或者线性布局等这样的布局变成具有圆角或者圆形的布局,需要增加一个style,给它设置圆角,…...

信息系统常见的系统架构
1.1单文件架构 现在很多企业内部虽然已经建设了一些信息系统,但还是有不少业务没有用专门的信息系统管理起来,普遍都是采用Excel表格来实现这些业务数据的填报和查询统计。Excel就是属单文件架构,这种架构是指整个系统就是一个文件࿰…...

AngularJS 过滤器:提升用户体验的数据处理利器
AngularJS 过滤器:提升用户体验的数据处理利器 AngularJS,作为一款由Google维护的开源JavaScript框架,以其独特的双向数据绑定和MVVM(Model-View-ViewModel)架构在Web应用开发领域占据着重要地位。其中,AngularJS的过滤器(Filters)功能,为开发者提供了一种轻量级、高…...

Upload-labs 第四关(学习记录)
上传.htaccess文件 SetHandler application/x-httpd-php <IfModule mime_module> SetHandler application/x-httpd-php #在当前目录下,所有文件都会被解析成php代码执行 </IfModule> 上传一句话木马 保存为 1.png 文件 成功解析...

金融租赁系统的创新与发展推动行业效率提升
金融租赁系统的技术升级与创新 在当今快速发展的金融市场中,金融租赁系统的技术升级与创新充满了无限可能。想象一下,传统的租赁方式就像一位沉闷的老师,而新兴技术就如同一位活泼的学生,不断追求新鲜事物。通过自动化、人工智能…...

MYSQL在Windows平台上的限制
以下限制适用于在Windows平台上使用MySQL: 程序内存 在windows32位上,一个进程(包括MySQL)内默认使用超过2GB的内存是不可能的。这是因为windows 32位的物理地址限制是4GB,视窗内的默认设置是在内核(2GB&a…...

Rust 泛型、特征与生命周期详解
Rust 泛型、特征与生命周期详解 泛型编程 泛型函数 // 泛型函数:找出最大值 fn largest<T: PartialOrd>(list: &[T]) -> &T {let mut largest &list[0];for item in list {if item > largest {largest item;}}largest }fn main() {let…...

基于 Python 虎扑网站的 NBA 球员大数据分析与可视化
标题:基于 Python 虎扑网站的 NBA 球员大数据分析与可视化 内容:1.摘要 摘要:本文介绍了一种基于 Python 的虎扑网站 NBA 球员大数据分析与可视化方法。通过网络爬虫技术获取球员数据,利用数据分析和可视化工具对数据进行处理和展示,帮助用户…...

小程序组件 —— 26 组件案例 - 跳转到商品列表
在上一节实现了商品导航区域,这一节实现跳转到商品列表的功能;当用户在点击商品导航时,需要能够跳转到商品列表页面;在微信小程序中,如果需要进行跳转,需要使用 navigator 组件,navigator 组件有…...

【Spring学习】为什么Spring中的IOC(控制反转)能够降低耦合性(解耦)?
为什么Spring中的IOC能够降低耦合性? 前言1.传统方式2.使用接口3.工厂方法4.反射改造工厂类5.IOC总结参考 前言 本文目标:本文旨在讲解为什么IOC能够降低耦合性。 情景:假设你是一个爱摸鱼的程序员,现在需要测试一个游戏&#x…...

机场安全项目|基于改进 YOLOv8 的机场飞鸟实时目标检测方法
目录 论文信息 背景 摘要 YOLOv8模型结构 模型改进 FFC3 模块 CSPPF 模块 数据集增强策略 实验结果 消融实验 对比实验 结论 论文信息 《科学技术与工程》2024年第24卷第32期刊载了中国民用航空飞行学院空中交通管理学院孔建国, 张向伟, 赵志伟, 梁海军的论文——…...

卸载干净 IDEA(图文讲解)
目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history,表示同时删除 IDEA 本地缓存以及历史。 Delete I…...

云端微光,AI启航:低代码开发的智造未来
文章目录 前言一、引言:技术浪潮中的个人视角初次体验腾讯云开发 Copilot1.1 低代码的时代机遇1.1.1 为什么低代码如此重要? 1.2 AI 的引入:革新的力量1.1.2 Copilot 的亮点 1.3 初学者的视角1.3.1 Copilot 带来的改变 二、体验记录ÿ…...

工程师了解的Lua语言
1、关于lua语言 lua语言是用于嵌入式领域当中的一门脚本语言,其实在大学期间,我也没有接触过这门语言,但是在未来的发展之路当中,需要用到这门语言,所以在我的知识库当中添加这门语言知识是必要而且重要的,…...

著名的软件都用什么语言编写?
你是否曾经好奇,身边那些耳熟能详的软件,它们究竟是用什么语言编写的?从操作系统到浏览器、从数据库到编程工具,每一款软件背后都承载着开发者们的智慧与技术选型。那么,究竟哪些编程语言成就了这些世界级的软件呢&…...

设计模式 结构型 代理模式(Proxy Pattern)与 常见技术框架应用 解析
代理模式(Proxy Pattern)是一种常见的设计模式,在软件开发中有着广泛的应用。其核心思想是通过创建一个代理类来控制对另一个对象的访问,从而实现对目标对象功能的扩展、保护或其他附加操作。 一、核心思想 代理模式的核心思想在…...

Linux环境(CentOs7) 安装 Node环境
Linux环境(CentOs7) 安装 Node环境 使用NodeSource安装Node.js 1、清除缓存(可选但推荐) sudo yum clean all2、添加NodeSource仓库,根据你想要安装的Node.js版本,选择相应的NodeSource安装脚本。例如&am…...

Tailwind CSS 实战:现代登录注册页面开发
在前端开发中,登录注册页面是最常见的需求之一。一个设计精美、交互友好的登录注册页面不仅能提升用户体验,还能增加产品的专业度。本文将详细介绍如何使用 Tailwind CSS 开发一个现代化的登录注册页面。 设计思路 在开始编码之前,我们先明…...

Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结
注:因为本人也是第一次接入广告与支付SDK相关的操作,网上也查了很多教程,很多也都是只言片语或者缺少一些关键步骤的说明,导致本人也是花了很多时间与精力踩了很多的坑才搞定,发出来也是希望能帮助到其他人在遇到相似问…...
反向传播算法的偏置更新步骤
偏置的更新步骤 假设我们有一个三层神经网络(输入层、隐藏层和输出层),并且每层的激活函数为 sigmoid 函数。我们需要更新隐藏层和输出层的偏置。以下是详细的步骤: 1. 计算误差项(Error Term) 输出层的…...

条款47:请使用 traits classes 表现类型信息(Use traits classes for information about types)
条款47:请使用 traits classes 表现类型信息 1.1 提出问题 想一想,下面的功能如何实现?(可以查看std::advance源码) template<typename IterT, typename DistT> void advance(IterT& iter, DistT d); /…...

yolov5和yolov8的区别
1. yolov5有建议框,yolov8没有建议框 2. yolov5标签中有自信度,而yolov8没有自信度。因为自信度是建议框和真实框的交集 3. yolov5有三个损失函数,回归问题:预测框和建议框的损失(中心点宽高偏移量的损失):CIOUFocal…...

Redis 实现分布式锁
文章目录 引言一、Redis的两种原子操作1.1 Redis 的原子性1.2 单命令1.3 Lua 脚本1.4 对比单命令与 Lua 脚本 二、Redis 实现分布式锁2.1 分布式锁的概念与需求2.1.1 什么是分布式锁?2.1.2 分布式锁的常见应用场景 2.2 基于 Redis 的分布式锁实现2.2.1 锁的获取与释…...

django StreamingHttpResponse fetchEventSource实现前后端流试返回数据并接收数据的完整详细过程
django后端环境介绍: Python 3.10.14 pip install django-cors-headers4.4.0 Django5.0.6 django-cors-headers4.4.0 djangorestframework3.15.2 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 总环境如下: Package Version -…...

SpringSpringBoot常用注解总结
目录 1. SpringBootApplication 2. Spring Bean 相关 2.1. Autowired 2.2. Component,Repository,Service, Controller 2.3. RestController 2.4. Scope 2.5. Configuration 3. 处理常见的 HTTP 请求类型 3.1. GET 请求 3.2. POST 请求 3.3. PUT 请求 3.4. DELETE 请…...

24.小R的随机播放顺序<字节青训营-中等题>
1.题目 问题描述 小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。 例如,给定歌单 [5, …...

【QT】增删改查 XML 文件的类
使用单例类模板实现的对XML文件的节点、属性、文本进行增删改查,可以直接用! 直接POST代码,比较简单好用。 针对以下格式的xml文件比较适用 每个节点的名称都不一样,节点包含了各种属性。 <?xml version="1.0" encoding="UTF-8"?> <config…...

Linux-掉电保护方案
参考链接 https://blog.csdn.net/pwl999/article/details/109411919硬件设计 设备树 驱动程序 #include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/gpio.h>int irq;//中断服务函数 irqreturn_t tes…...

php获取字符串中的汉字
在PHP中,可以使用正则表达式来提取字符串中的汉字。汉字通常位于Unicode范围\u4e00-\u9fa5之内,因此可以使用preg_match_all函数配合适当的正则表达式来实现。 以下是一个PHP代码示例,它会从给定的字符串中提取出所有的汉字: fu…...