作者:just_sort

链接:https://blog.nowcoder.net/n/e668319c70b64fab945871e5ab6cc363

来源:牛客网

算法原理

在上文我们使用LDA实现了一个二分类任务。那么数据有大于2种类别,假设为C类,这时候怎么办呢?在上文我们定义的“类间散度矩阵”

就不再适用,所以我们这里引入“全局散度矩阵”:

其中muμ是所有示例的均值向量。将类内散度矩阵S_wSw​重定义为每个类别的散度矩阵之和,即:

从上面两个式

推得:

其中N代表类别数,m_imi​代表第i类的示例数。

关于这个等式的推导可以看南瓜书,我这里截图过来一下:

这里偷了一张图,可以更好的理解这个算法。

显然,多分类LDA有多种实现方法:使用S_b,S_w,S_tSb​,Sw​,St​三者中的任意两个即可。常见一种实现是采用优化目标:

式3.35就是我们上篇博客写的“广义瑞利商”。其中的tr()为矩阵的迹,一个n×n的对角矩阵A的主对角线(从左上方至右下方的对角线)上各个元素的总和被称为矩阵A的迹(或迹数),一般记作tr(A)。

这个优化目标实际上等价于求解多个w组合成W,那么该问题就等价于求解多个上一章的优化目标,使用相同的方法,可以求得下式:

即是:

W的闭式解为

的d'个最大非零广义特征值对应的特征向量组成的矩阵,d'<=N-1d′<=N−1。

如果将W视为一个投影矩阵,则多分类LDA将样本投影到d'维空间,d'通常远小于数据的原有属性d'′。于是,可以通过这个投影来减小样本点的维数,且投影过程中使用了类别信息,因此LDA也常常被视为一种经典的监督降维技术。

接下来使用sklearn中的aris数据,并使用LDA算法对其进行降维,并可视化。

代码

#
coding = utf - 8
import numpy as np
from sklearn.datasets
import load_iris
import matplotlib.pyplot as plt# 这是sklearn中实现的LDA, 待会我们会比较自己实现的LDA和它的区别
from sklearn.discriminant_analysis
import LinearDiscriminantAnalysis# k为目标
def LDA(X, y, k):label_ = list(set(y))
X_classify = {}
for label in label_:X1 = np.array([X[i]for i in range(len(X)) if y[i] == label])
X_classify[label] = X1miu = np.mean(X, axis = 0)
miu_classify = {}
for label in label_:miu1 = np.mean(X_classify[label], axis = 0)
miu_classify[label] = miu1# St = np.dot((X - mju).T, X - mju)# 计算类内散度矩阵Sw
Sw = np.zeros((len(miu), len(miu)))
for i in label_:Sw += np.dot((X_classify[i] - miu_classify[i]).T, X_classify[i] - miu_classify[i])# Sb = St - Sw# 计算类内散度矩阵Sb
Sb = np.zeros((len(miu), len(miu)))
for i in label_:Sb += len(X_classify[i]) * np.dot((miu_classify[i] - miu).reshape((len(miu), 1)), (miu_classify[i] - miu).reshape((1, len(miu))))# 计算S_w ^ {-1
}
S_b的特征值和特征矩阵
eig_vals, eig_vecs = np.linalg.eig(np.linalg.inv(Sw).dot(Sb))
sorted_indices = np.argsort(eig_vals)# 提取前k个特征向量
topk_eig_vecs = eig_vecs[: , sorted_indices[: -k - 1: -1]]
return topk_eig_vecsdef main():iris = load_iris()
X = iris.data
y = iris.targetW = LDA(X, y, 2)
X_new = np.dot(X, W)
plt.scatter(X_new[: , 0], X_new[: , 1], marker = 'o', c = y)
plt.show()# 和sklearn的函数对比
lda = LinearDiscriminantAnalysis(n_components = 2)
lda.fit(X, y)
X_new = lda.transform(X)
plt.scatter(X_new[: , 0], X_new[: , 1], marker = 'o', c = y)
plt.show()main()

降到二维的效果图

(我们实现的LDA算法的降维结果)

可以看到使用LDA算法成功实现了多分类数据的降维。

查看作者更多博客:https://blog.nowcoder.net/bbuf

欢迎关注公众号:牛客NOIP竞赛学

fisher线性判别算法python_干货|机器学习算法之线性判别分析相关推荐

  1. 干货 | 机器学习算法在饿了么供需平衡系统中的应用

    干货 | 机器学习算法在饿了么供需平衡系统中的应用 image:url(https://ask.qcloudimg.com/avatar/1292807/6341kxs4h2.png?imageVie ...

  2. Interview:算法岗位面试—10.23下午—上海某科技公司算法岗位(偏机器学习算法,上市)技术面试之比赛积累、项目经验、个人未来发展

    Interview:算法岗位面试-10.23下午-上海某科技公司算法岗位(偏机器学习算法,上市)技术面试之比赛积累.项目经验.个人未来发展 导读:该面试,是线上笔试通过之后,邀约的面试.整个面试过程比 ...

  3. 正确率能很好的评估分类算法吗_机器学习算法优缺点对比及选择(汇总篇)

    转自:机器学习与统计学 本文的目的,是务实.简洁地盘点一番当前机器学习算法.文中内容结合了个人在查阅资料过程中收集到的前人总结,同时添加了部分自身总结,在这里,依据实际使用中的经验,将对此模型优缺点及 ...

  4. etc的常见算法_运用机器学习算法研究城市形态与户外温度之间的相关性

    随着城市化进程以及气候变化的加剧,城市正经历着频率更高.强度更大.持续时间更长的热浪天气.目前学者提出许多研究不同尺度气候问题的方法,其中最常用的是参数回归方法,如最小二乘法回归模型(OLS,ordi ...

  5. 正确率能很好的评估分类算法吗_机器学习算法:分类知识超全总结!

    关注上方"Python数据科学",选择星标,关键时间,第一时间送达! ☞500g+超全学习资源免费领取  Datawhale,译者:张峰本文将介绍机器学习算法中非常重要的知识-分类 ...

  6. 机器学习 线性回归算法_探索机器学习算法简单线性回归

    机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...

  7. 哈希算法python_哈希算法(Python代码实现)

    1.常见的数据查找算法: 众所周知,顺序查找是最简单的查找方式,但要将所有数据遍历一遍所以效率相对较低,对大数据量的査找问题显然不行.二分查找的查找效率虽然非常高但是数据必须有序,而对数据排序通常需要 ...

  8. 逻辑回归算法python_逻辑回归算法原理和例子

    本课程讲解现在工业界和学术界流行的机器学习算法的相关知识,以及如何用python去实现这些算法.算法的讲解包括supervised learning(有监督式学习)和unsupervised lear ...

  9. 深度学习算法和机器学习算法_63种机器学习算法介绍

    深度学习算法和机器学习算法 Data Science and analytics are transforming businesses. It has penetrated into all dep ...

  10. 蚂蚁算法python_蚁群算法python编程实现

    前言 这篇文章主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python中的实现代码,具有一定参考价值,需要的朋友可以了解下. 蚁群算法简介 蚁群算法(ant c ...

最新文章

  1. Linux: debian/ubuntu下安装和使用Java 8
  2. mysql探活_MYSQL探索
  3. hadoop配置文件默认配置
  4. NickLee.FortuneBase数据库sql server版本系统配置说明
  5. 外挂学习之路(2)--- 老生常谈“基地址”
  6. 前端笔记----定位
  7. leetcode 1. 两数之和(map)
  8. Spring mvc配置文件
  9. 【matlab】在图中插入矩形(框or阴影)
  10. 软件工程期中作业-阅读和提问
  11. 一路PN码串行捕获设计--基于《通信收发信机的verilog实现与仿真》实例
  12. 10款非常棒的开源论坛系统推荐
  13. 【模糊综合评价原理与案例】
  14. 开源项目推荐系列(短信网关)
  15. 香港服务器要个人信息么,香港个人信息应当遵循服务器23.225合法
  16. 小程序ios页面数据空白问题
  17. 在tsx里写html模板,在Vue中写TSX有哪些需要注意的地方
  18. mybatis plus 看这篇就够了,一发入魂
  19. 搭建通过openOCD下载mini2440程序的调试平台
  20. 移动网页布局基础:京东网页

热门文章

  1. junit linux命令行运行,如何从命令行在JUnit中运行测试用例?
  2. python根据行名称生成二维数组
  3. sklearn 使用joblib保存模型,并解决cannot import name joblib from sklearn.externals报错
  4. 大学计算机基础方案一,大学计算机基础案例教学与教学案例策划.doc
  5. 计算机网络ppt_大学四年,我这样学操作系统和计算机网络,毕业后成为了别人眼中的大神(附书籍推荐)
  6. linux识别科学计数法,Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]...
  7. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第四天(非原创)
  8. [5.数据类型] 零基础学python,简单粗暴
  9. filddler一个抓包修改的工具 貌似很强大2017.12.07
  10. smarty模板基础知识