Fisher(LDA)判别的推导+python代码实现二分类

2023-05-16

Fisher判别的推导

  • 一、Fisher算法的主要思想
  • 二、Fisher数学算法步骤
      • ①计算各类样本均值向量 m i m_i mi, m i m_i mi是各个类的均值, N i N_i Ni w i w_i wi类的样本个数。
      • ②计算样本类内离散度矩阵 S i S_i Si和总类内离散度矩阵 S w S_w Sw
      • ③计算样本类间离散度矩阵 S b S_b Sb
      • ④求投影方向向量 W W W (维度和样本的维度相同)。我们希望投影后,在一维 Y Y Y空间里各类样本尽可能分开,就是我们希望的两类样本均值之差 ( m 1 ‾ − m 2 ‾ ) (\overline{m_1}-\overline{m_2}) (m1m2)越大越好,同时希望各类样本内部尽量密集,即是:希望类内离散度越小越好。因此,我们可以定义Fisher准则函数为:
      • 2使得 J F ( w ) J_F(w) JF(w)取得最大值 w w w为:
      • ⑤将训练集内所有样本进行投影。
      • ⑥. 计算在投影空间上的分割阈值 y 0 y_0 y0,在一维Y空间,各类样本均值 m i ‾ \overline{m_i} mi为:
      • ⑦对于给定的测试样本 x x x,计算出它在 w w w上的投影点 y y y
      • ⑧根据决策规则分类!
  • 三、python代码实现
      • 1.数据生成
      • 2、fisher算法实现
      • 3、判断类别
      • 4.绘图
      • 5.运行结果:

一、Fisher算法的主要思想

  • 线性判别分析(Linear Discriminant Analysis
    简称LDA)是一种经典的线性学习方法,在二分类问题上因为最早由【Fisher,1936年】提出,所以也称为“Fisher 判别分析!”
    Fisher(费歇)判别思想是投影,使多维问题简化为一维问题来处理。选择一个适当的投影轴,使所有的样本点都投影到这个轴上得到一个投影值。对这个投影轴的方向的要求是:使每一类内的投影值所形成的类内离差尽可能小,而不同类间的投影值所形成的类间离差尽可能大。
    在这里插入图片描述

二、Fisher数学算法步骤

  • 为了找到最佳投影方向,需要计算出 各类样本均值、样本类内离散度矩阵 Si\boldsymbol S_{i}S i和样本总类内离散度矩阵 Sw\boldsymbolS_{w}Sw、样本类间离散度矩阵 Sb\boldsymbol S_{b}Sb ,根据Fisher准则,找到最佳投影向量,将训练集内的所有样本进行投影,投影到一维Y空间,由于Y空间是一维的,则需要求出Y空间的划分边界点,找到边界点后,就可以对待测样本进行一维Y空间投影,判断它的投影点与分界点的关系,将其归类。具体方法如下(以两类问题为例子):

①计算各类样本均值向量 m i m_i mi, m i m_i mi是各个类的均值, N i N_i Ni w i w_i wi类的样本个数。

在这里插入图片描述

②计算样本类内离散度矩阵 S i S_i Si和总类内离散度矩阵 S w S_w Sw

在这里插入图片描述

③计算样本类间离散度矩阵 S b S_b Sb

在这里插入图片描述

④求投影方向向量 W W W (维度和样本的维度相同)。我们希望投影后,在一维 Y Y Y空间里各类样本尽可能分开,就是我们希望的两类样本均值之差 ( m 1 ‾ − m 2 ‾ ) (\overline{m_1}-\overline{m_2}) (m1m2)越大越好,同时希望各类样本内部尽量密集,即是:希望类内离散度越小越好。因此,我们可以定义Fisher准则函数为:

在这里插入图片描述

2使得 J F ( w ) J_F(w) JF(w)取得最大值 w w w为:

在这里插入图片描述

⑤将训练集内所有样本进行投影。

在这里插入图片描述

⑥. 计算在投影空间上的分割阈值 y 0 y_0 y0,在一维Y空间,各类样本均值 m i ‾ \overline{m_i} mi为:

在这里插入图片描述
样本类内离散度 S i ‾ 2 \overline{S_i}^2 Si2和总类内离散度 S w ‾ \overline{S_w} Sw
在这里插入图片描述
而此时类间离散度就成为两类均值差的平方。
在这里插入图片描述

计算阈值 y 0 y_0 y0
在这里插入图片描述

⑦对于给定的测试样本 x x x,计算出它在 w w w上的投影点 y y y

在这里插入图片描述

⑧根据决策规则分类!

在这里插入图片描述

三、python代码实现

1.数据生成

from sklearn.datasets import make_multilabel_classification
import numpy as np

x, y = make_multilabel_classification(n_samples=20, n_features=2,
                                      n_labels=1, n_classes=1,
                                      random_state=2)  # 设置随机数种子,保证每次产生相同的数据。

# 根据类别分个类
index1 = np.array([index for (index, value) in enumerate(y) if value == 0])  # 获取类别1的indexs
index2 = np.array([index for (index, value) in enumerate(y) if value == 1])  # 获取类别2的indexs

c_1 = x[index1]   # 类别1的所有数据(x1, x2) in X_1
c_2 = x[index2]   # 类别2的所有数据(x1, x2) in X_2

2、fisher算法实现

# 2、Fisher算法实现
def cal_cov_and_avg(samples):
    """
    给定一个类别的数据,计算协方差矩阵和平均向量
    :param samples:
    :return:
    """
    u1 = np.mean(samples, axis=0)
    cov_m = np.zeros((samples.shape[1], samples.shape[1]))
    for s in samples:
        t = s - u1
        cov_m += t*t.reshape(2, 1)
    return cov_m, u1
def fisher(c_1, c_2):
    """
    fisher算法实现(参考上面的推导公式进行理解)
    :param c_1:
    :param c_2:
    :return:
    """
    cov_1, u1 = cal_cov_and_avg(c_1)
    cov_2, u2 = cal_cov_and_avg(c_2)
    s_w = cov_1 + cov_2          # 总类内离散度矩阵。
    u, s, v = np.linalg.svd(s_w) # 下面的参考公式(4-10)
    s_w_inv = np.dot(np.dot(v.T, np.linalg.inv(np.diag(s))), u.T)
    return np.dot(s_w_inv, u1 - u2)

3、判断类别

def judge(sample, w, c_1, c_2):
    """
    返回值:ture 属于1;false 属于2
    :param sample:
    :param w:
    :param c_1:
    :param c_2:
    :return:
    """
    u1 = np.mean(c_1, axis=0)
    u2 = np.mean(c_2, axis=0)
    center_1 = np.dot(w.T, u1) # 参考公式(2-8)
    center_2 = np.dot(w.T, u2)
    pos = np.dot(w.T, sample)  # 新样本进来判断
    return abs(pos - center_1) < abs(pos - center_2)

w = fisher(c_1, c_2)             # 调用函数,得到参数w
out = judge(c_2[1], w, c_1, c_2) # 判断所属的类别。
print(out)

4.绘图

# 4、绘图功能
plt.scatter(c_1[:, 0], c_1[:, 1], c='red')
plt.scatter(c_2[:, 0], c_2[:, 1], c='blue')
line_x = np.arange(min(np.min(c_1[:, 0]), np.min(c_2[:, 0])),
                   max(np.max(c_1[:, 0]), np.max(c_2[:, 0])),
                   step=1)
line_y = -(w[0]*line_x) / w[1]
plt.plot(line_x, line_y, linewidth=3.0,  label = 'fisher boundary line ')
plt.legend(loc='upper right')
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.show()

5.运行结果:

在这里插入图片描述

参考链接:https://blog.csdn.net/abc13526222160/article/details/90611743
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fisher(LDA)判别的推导+python代码实现二分类 的相关文章

  • STM32工程创建的快速方法

    1 Project gt New Project 2 打开新创建的工程的所在目录 xff0c 删除掉目录中的两个文件夹 xff0c 新创建4个文件夹 xff0c 分别是 xff1a USER CODE OBJ STM32F10 xFWLib
  • Ubuntu18.04下ROS的安装教程、rosdep init问题亲测解决方案

    一 确定自己的Ubuntu版本号 xff0c 并且安装正确的ros版本 lsb release a 查看ubuntu版本 二 更新源 sudo sh c 39 etc lsb release amp amp echo 34 deb http
  • MySQL相关面试题总结

    1 解释一下单列索引和联合索引 单列索引是指在表的某一列上创建索引 联合索引是在多个列上联合创建索引 单列索引可以出现在where条件的任何位置 而联合索引需要按照一定的顺序来写 在多条件查询的时候 联合索引的效率更高 我们联合索引也最多创
  • 修改firefox浏览器滚动条的样式

    最近做了一个网站的项目 xff0c 使用原生的滚动条 ie和谷歌都显示的好好的 xff0c 火狐的滚动条样式没有生效 原因 xff1a 火狐浏览器没有提供原生滚动条的方法和属性 后来浏览器升级之后提供了部分可以修改样式的属性 属性较多 xf
  • jetson nx ssd镜像克隆

    1 打开disk查看要克隆的ssd名称 2卸载ssd 制作镜像 sudo umount dev sdb1 sudo s sudo dd if 61 dev sdb1 conv 61 sync noerror bs 61 64k gzip c
  • Android 关于IPV6 DNS的问题

    目前在测试IPV6 DNS解析的时候发现一个问题 xff0c 这里记录一下 问题是 xff1a 当dhcpv6服务器分配的IPV6 dns是fe80类型的dns时 xff0c 无法发送dns请求 xff0c 抓包看不到有目标地址为fe80
  • PX4开发环境搭建

    PX4开发环境搭建 编译工具链的安装vscode 编译工具链的安装 下载ubuntu sh requirements txt wget https raw githubusercontent com PX4 Firmware master
  • TFmini在nora+(px4)上的使用和验证

    目标 xff1a 使用tfmini完成定高实验 设置 xff1a 1 sens tfmini cfg 设置为telem2 xff08 可修改为其他 xff0c 保证硬件连线一致 xff0c 1一般是无线数传所以没改过去 其他的对应在官网里有
  • ROS | Realsense中的IMU解算orientation

    文章目录 概述 一 定义介绍 二 操作教程 一 下载并编译imu tools功能包 1 创建工作空间并初始化 2 下载imu tools并编译 二 修改配置 1 修改imu tools源码 2 修改launch文件 3 启动解算 概述 本文
  • prometheus服务监控之mysql监控

    文章目录 上传解压安装mysqld exporter安装mariadb在数据库里创建mysql账号用户收集数据在mysql exporter中设置mysql配置信息启动mysql exporter配置prometheus拉取mysql节点信
  • HTTP请求头Authorization

    今天部署了一个Authorization项目 xff0c 由于改了auth服务器客户端id和密码 xff0c 而前端请求header没有修改 xff0c 登录时一直弹框要求输入用户名和密码 xff0c 输入后却无效 xff0c 只好改前端代
  • c语言编程规范第三部分

    3 头文件应向稳定的方向包含 头文件的包含关系是一种依赖 xff0c 一般来说 xff0c 应当让不稳定的模块依赖稳定的模块 xff0c 从而当不稳定的模块发生变化时 xff0c 不会影响 xff08 编译 xff09 稳定的模块 就我们的
  • 看完《C++ primer》后,我都收获了什么?

    文章目录 1 语言只是一个工具2 光学会一门语言还不够3 结语 迫于读研和未来就业的压力 xff0c 我研一上自学了C 43 43 的这门语言 xff0c 自我感觉比较认真的看完了 C 43 43 primer 这本书的大部分章节 xff0
  • Ubuntu18.04 ROS Melodic版本安装gazebo_ros_pkgs包

    疫情期间宅在家没法做实验 xff0c 只能上手gazebo做仿真 xff0c 导入实验室机器人的相关文件后 xff0c 打算看看效果 xff0c 运行代码 roslaunch probot gazebo probot anno gazebo
  • vim如何批量注释

    1 ctrl 43 v 进入 2 按箭头 选中要注释的首行 3 按下大写 i 进入插入模式 4输入 按esc 就可以看到如下内容
  • 还弄不明白【委托和事件】么?看这一篇就足够了!!!

    这两个概念长时间不用了 xff0c 今天看到CAD二次开发中用到了自定义事件 xff0c 有点迷糊了 xff0c 索性再整理一下加深印象 xff01 一说到委托和事件 xff0c 他们总是绑定在一起的不可分割 xff01 可能你会说啊 xf
  • 三种简单排序(冒泡、插入、选择)的比较和图解

    冒泡排序 这种排序方式是最容易理解的 xff0c 主体思想就是 xff1a 指针重复地走访过要排序的数列 xff0c 一次比较两个元素 xff0c 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 xff0c
  • ModuleNotFoundError: No module named 'XXX'的解决办法

    类似问题一 ModuleNotFoundError No module named 39 captcha 39 pycharm打开的项目 xff0c 在虚拟环境里通过终端命令python manage py runserver运行pytho
  • 微信小程序实现搜索功能以及效果(超详细)

    我们先来看一下实现哪些功能 1 搜索历史记录以及清空历史记录 2 热门搜索推荐以及更新推荐内容 3 根据输入框输入的内容来自动搜索相关查询 后台逻辑是模糊查询 后台就先不扯了 这里我用的是自己定义的虚拟数据 暂时没用后台接口 可能有点问题
  • 微信小程序实现收货地址城市选择效果(添加收货地址)

    先来张效果图 这里主要是城市选择效果 请忽视其他 不要吐槽 谢谢 接下来看一下代码吧 wxml lt pages my my add address index wxml gt lt view class 61 34 redact addr

随机推荐

  • uni-app实现商城多商家购物车功能(超详细, 附带源码)

    我们先来看一下效果 有什么不懂可以直接下方留言 先来看代码 lt template gt lt view class 61 34 cart 34 gt lt 购物车为空 S gt lt view v if 61 34 cartList le
  • 微信小程序web-view的使用教程

    最近公司有需求 xff0c 需要点击小程序首页banner xff0c 跳转到别人的h5页面 首先是域名的问题 xff1a 步骤 xff1a 先登录小程序开发平台 xff0c 将页面需要跳转的域名写上去 xff0c 注意了 xff0c 域名
  • uni-app实现上传图片裁剪效果(附源码)

    我们先来看一下效果 封装一个组件在components下创建一个 文件夹随意命名 xff0c 这里我是uni img cropper uni img cropper vue lt template gt lt view class 61 3
  • js 一维数组和二维数组实现足迹、浏览记录等场景

    再开发过程中 xff0c 再没有接口提供的情况下来实现浏览记录或者搜索记录等场景 我们可以利用本地缓存实现 xff0c 废话不多说 xff0c 直接上代码 xff1a 多维数组 64 param Array arr 数组 64 param
  • Markdown使用(超详细)

    xff08 HBuilderX xff09 掌握md及HBuilderX对md的强大支持 如果没有点右键设置自动换行 xff0c 可按Alt 43 滚轮横向滚动查看 很多人只把markdown用于网络文章发表 xff0c 这糟蹋了markd
  • 宫格导航 (自定义更灵活,超详细)

    先来看一下效果 调用方法 lt 页面调用 gt lt nav grid list 61 34 menu 34 64 click 61 34 34 gt lt nav grid gt 数据 export default data return
  • Firefox和Chromedriver驱动下载及安装步骤

    Mozilla Firefox Mozilla Firefox 中文名称 34 火狐 34 是由一个自由及开放源代码的网页浏览器 使用Gecko排版引擎 支持多种操作系统 如 Windows Mac OS X 及GNU Linux等 该浏览
  • 流媒体选择Nginx是福还是祸?

    流媒体选择Nginx是福还是祸 xff1f CDN xff0c 视频云 xff0c 已经 僧多粥少 视频直播的持续升温 xff0c 无意间也让带宽生意的争夺变得异常残酷 一时间 xff0c 各种云计算 CDN 视频云提供商都在视频尤其是直播
  • xpath去除换行\空格

    使用xpath获取文本内容 有空格或者换行就用normalize space 方法 例 intro li 61 div xpath 39 normalize space div 64 class 61 34 bookinfo 34 p te
  • Java 静态域和静态方法

    main方法都被标记为static修饰符 xff0c 本文讨论一下该修饰符含义 静态域和静态方法 一 静态域静态常量 二 静态方法三 工厂方法 一 静态域 若把域定义为static xff0c 则每个类中只有一个这样的域 而每一个对象对于所
  • Linux下传感器驱动。rk3399

    基于rk3399的Linux下的陀螺仪mpu9250传感器驱动 mpu6050 bh1750传感器 xff0c sht30 35温湿度传感器驱动 已经成功移植 xff0c 通过iic驱动获取到数据 Linux驱动开发
  • DaSaimRPN代码运行记录

    demo py xff1a 下载模型 SiamRPNVOT model 放入 code 文件夹即可 test otb py xff1a 在网上下载 OTB2015 数据集放入 data 文件夹中 更改 parser 参数 dataset 运
  • Linux环境下LLVM 6.0 + clang安装步骤

    可以转载 xff0c 请注明出处 xff01 1 准备工作 首先确保你的Linux系统是可以联网的 xff0c 我是win10环境下的VMware 15 43 centos 7 xff0c 这个应该没影响 xff0c 之所以说 xff0c
  • Pixhawk ulog飞行日志分析

    在python下安装pyulog xff0c 在 ulog文件目录下输入ulog2csv即可将ulog转化为csv形式输出 ulog文件的保存时间 43 8即为飞行实际的时间 timestamp为时间戳 xff0c 除以10 6后单位为秒
  • java看书规划

    Java编程思想 大话设计模式 重构 改善既有代码的设计 effective java 深入理解Java虚拟机 Java并发编程实战 深入理解计算机系统 xff0c tcp ip详解 卷一 二 三 xff0c 数据结构与算法 xff08 三
  • 学习ROS常用的官方网站,学习资源整理

    1 ROS仿真知识点rviz urdf gazebo的知识点网站 xff1a https wiki ros org urdf http wiki ros org rviz http gazebosim org tutorials tut 6
  • 双非末流一本大四在校生第一次线下面试总结(嵌入式软件实习生方向)

    嵌入式软件实习生面试经验总结 面试写到的技能一定要熟悉 一定要边学习边找工作 xff0c 当你技能不够的时候还是先去学习吧 面试时间 xff1a 11 11 面试公司 xff1a 北京迅为电子有限公司 笔试题目 xff1a xff08 其实
  • linux ubuntu 无法显示回收站内容

    最近一直无法查看回收站的内容 xff0c 沙漏一直转 xff0c 最后直接就显示为空 索性直接忽略 xff0c 从回收站文件中把需要的东西cp mv出来 回收站文件放在 xff1a local share Trash files 里 xff
  • ROS下,安装rviz并用rviz播放bag文件实现并可视化

    ROS下 xff0c 安装rviz并用rviz播放bag文件实现并可视化 一 ROS下 xff0c 安装rviz二 用rviz播放bag文件 一 ROS下 xff0c 安装rviz 1 安装rviz span class token fun
  • Fisher(LDA)判别的推导+python代码实现二分类

    Fisher判别的推导 一 Fisher算法的主要思想二 Fisher数学算法步骤 计算各类样本均值向量 m i m i