热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【ML】LinearDiscriminantAnalysis线性判别分析

文章目录基本思想.优化目标推导.多分类推广.应用实例.基本思想.线性判别分析LDA于1936年由Fisher提出,其基本思想是将给定的训练集设法投影到一条直线lll

文章目录

  • 基本思想.
  • 优化目标推导.
  • 多分类推广.
  • 应用实例.


基本思想.
  • 线性判别分析LDA于1936年由Fisher提出,其基本思想是将给定的训练集设法投影到一条直线 lll 上,并且很自然地,我们力求投影点集合中同类的点相距越近越好,异类的点相距越远越好。
  • 给定一个新样本,采用同样的投影方法,将其投影到 lll 上,再根据投影点的位置来确定其类别。
    在这里插入图片描述

优化目标推导.
  • 给定训练集 D={(xi,yi)}i=1m,yi∈{0,1,..,K}D=\{(x_i,y_i)\}_{i=1}^m,y_i∈\{0,1,..,K\}D={(xi,yi)}i=1m,yi{0,1,..,K} ,记 μi,Σi\mu_i,\Sigma_iμi,Σi分别为第 kkk 类样本的均值向量和协方差矩阵。不妨假定将数据集 DDD 投影到直线 y=wTxy=w^Txy=wTx 上,截距项只是对直线产生平移效果,对于第一部分我们所关心的同类点、异类点的距离并无影响。
  • 先从二分类问题入手,即 yi∈{0,1}y_i∈\{0,1\}yi{0,1},那么投影后,我们得到两类样本点的均值向量在直线上的投影分别为 【wTμ0、wTμ1w^T\mu_0、w^T\mu_1wTμ0wTμ1】,两类样本投影点的协方差分别为 【wTΣ0w、wTΣ1ww^T\Sigma_0w、w^T\Sigma_1wwTΣ0wwTΣ1w】。此时所有的样本投影点点都位于直线上,易知投影点均值以及投影点协方差皆为实数。
  • 考虑第一部分给出的基本思想,同类点尽可能靠近,异类点尽可能远离,即我们希望两类样本投影点的协方差都尽可能小,而两个均值要差距尽可能大,形式化的描述如下:
    在这里插入图片描述
  • 其中 JJJ 即为我们希望最大化的目标,其分母使得类内距离趋向小,分子使得类间距离趋向大。在原数据维度定义类内散度矩阵以及类间散度矩阵,改写优化目标如下:
    在这里插入图片描述
  • 上式中 SwS_wSw 代表类内散度矩阵with-in,SbS_bSb 代表类间散度矩阵between,JJJ 称为二者的广义瑞利商Generalized Rayleigh Quotient。目标是最大化 JJJ,无论是直观理解还是从广义瑞利商的定义式出发,参数 www 的大小并不影响LDA的结果,只有其方向会影响投影点的分布。
  • 不失其一般性,我们在最大化 JJJ 的过程中加入限制,令 wTSww=1w^TS_ww=1wTSww=1,那么该优化问题改写为:
    在这里插入图片描述
  • 使用等式约束下的拉格朗日乘数法,得到如下的推导过程:
    在这里插入图片描述
  • 最终得到了参数 www 的解析解,实际应用中考虑到数值解的稳定性,在计算类间散度矩阵 SwS_wSw 的逆时会先进行奇异值分解,而后在求出其逆矩阵。

多分类推广.
  • 从二分类问题推广到多分类问题,假定共有 KKK 个类,mmm 个样本,定义全局散度矩阵total如下所示 :
    在这里插入图片描述

应用实例.
  • 导入数据,计算均值。

LdaData = np.loadtxt("data2.txt")
Pos0 = np.where(LdaData[:,2] == 0)
Pos1 = np.where(LdaData[:,2] == 1)
X1 = LdaData[Pos0,0:2]
X1 = X1[0,:,:]
X2 = LdaData[Pos1,0:2]
X2 = X2[0,:,:]MeanX1 = np.mean(X1,axis=0)
MeanX2 = np.mean(X2,axis=0)
print(X1.shape)
print(X2.shape)
print(MeanX1)



  • 计算类内、类间散度矩阵,本例中基于式 Sbw=λSwwS_bw=\lambda S_wwSbw=λSww,从而有:Sw−1Sbw=λwS_w^{-1}S_bw=\lambda wSw1Sbw=λw 对矩阵 Sw−1SbS_w^{-1}S_bSw1Sb 进行特征分解后选择垂直于 μ0−μ1\mu_0-\mu_1μ0μ1 的特征向量即可。(下面代码中直接选择主特征值对应的特征向量,现在看应该是诈胡了,我也记不清自己当时怎么想的了,修改后的部分在最后).

def ComputeS_w(X,MeanX):### START THE CODE ###S = np.dot((X-MeanX).T,X-MeanX) # np.dot 计算类内散度### END THE CODE ###return STestS_i = ComputeS_w(X1,MeanX1)
print("TestS_i = ",TestS_i)def ComputeS_b(X1Mean,X2Mean):### START THE CODE ###S = np.dot(X1Mean-X2Mean,(X1Mean-X2Mean).T) # np.dot 计算类间散度### END THE CODE ###return SSb = ComputeS_b(MeanX1,MeanX2)
print("Sb = ", Sb)Sw_1 = ComputeS_w(X1,MeanX1)
Sw_2 = ComputeS_w(X2,MeanX2)
Sw = Sw_1 + Sw_2
[V,L] = np.linalg.eig(np.dot(np.linalg.inv(Sw),Sb))
print(V)
print(L)
index = np.argsort(-V)
W = L[:,index[0]]
print("W = ", W)def TranLine(X,K):X_i = []Y_i = []for i in range(np.size(X,0)):y_0 = X[i,1]x_0 = X[i,0]x1 = (k*(y_0-b)+x_0)/(k**2+1)y1 = K*x1+bX_i.append(x1)Y_i.append(y1)return X_i,Y_ib = 0
x = np.arange(2,10)
k = W[1]/W[0]
y=k*x+b
plt.plot(x,y)
plt.scatter(X1[:,0],X1[:,1],marker='+',color='r',s=40)
plt.scatter(X2[:,0],X2[:,1],marker='*',color='b',s=40)
plt.grid()
plt.show()
X_1,Y_1 = TranLine(X1,k)
X_2,Y_2 = TranLine(X2,k)
plt.plot(x,y)
plt.scatter(X1[:,0],X1[:,1],marker='+',color='r',s=60)
plt.scatter(X2[:,0],X2[:,1],marker='*',color='b',s=60)
plt.grid()
plt.plot(X_1,Y_1,'r+')
plt.plot(X_2,Y_2,'b>')

在这里插入图片描述在这里插入图片描述

  • 【勘误】

def ComputeS_w(X,MeanX):### START THE CODE ###S = np.dot((X-MeanX).T,X-MeanX) # np.dot 计算类内散度### END THE CODE ###return STestS_i = ComputeS_w(X1,MeanX1)
print("TestS_i = ",TestS_i)def ComputeS_b(X1Mean,X2Mean):### START THE CODE ###S = np.dot(X1Mean-X2Mean,(X1Mean-X2Mean).T) # np.dot 计算类间散度### END THE CODE ###return SSb = ComputeS_b(MeanX1,MeanX2)
print("Sb = ", Sb)Sw_1 = ComputeS_w(X1,MeanX1)
Sw_2 = ComputeS_w(X2,MeanX2)
Sw = Sw_1 + Sw_2
# [V,L] = np.linalg.eig(np.dot(np.linalg.inv(Sw),Sb))
# print(V)
# print(L)
# index = np.argsort(-V)
# W = L[:,index[0]]
W = np.dot(np.linalg.inv(Sw),MeanX1-MeanX2)
print("W = ", W)


推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文讨论了在使用pytorch进行二分类问题的模型预测时,为什么会出现概率大于1或小于0的情况,给出了相关代码和解决方法。同时,还介绍了使用pytorch进行模型训练和优化的步骤。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
author-avatar
mobiledu2502909493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有