Fisher判别的推导

  • 一、Fisher算法
    • (一)Fisher算法描述
    • (二)具体步骤
      • 1、计算W值
      • 2、计算阈值
      • 3、Fisher线性判别的决策规则
  • 二、Python代码完成Fisher判别的推导
    • (一)Python全部代码
    • (二)运行结果

一、Fisher算法

(一)Fisher算法描述

Fisher线性判别分析的基本思想:选择一个投影方向(线性变换,线性组合),将高维问题降低到一维问题来解决,同时变换后的一维数据满足每一类内部的样本尽可能聚集在一起,不同类的样本相隔尽可能地远。

Fisher线性判别分析:通过给定的训练数据,确定投影方向W和阈值w0, 即确定线性判别函数,然后根据这个线性判别函数,对测试数据进行测试,得到测试数据的类别。

Fisher选择投影方向W的原则,即使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求。

(二)具体步骤

1、计算W值




2、计算阈值

3、Fisher线性判别的决策规则

Fisher准则函数满足两个性质:
(1)投影后,各类样本内部尽可能密集,即总类内离散度越小越好
(2)投影后,各类样本尽可能离得远,即样本类间离散度越大越好
根据这个性质确定准则函数,根据使准则函数取得最大值,可求出W:

这就是Fisher判别准则下的最优投影方向,最后得到决策规则:

二、Python代码完成Fisher判别的推导

(一)Python全部代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
path=r'media/Iris.csv'
df = pd.read_csv(path, header=0)
Iris1=df.values[0:50,0:4]
Iris2=df.values[50:100,0:4]
Iris3=df.values[100:150,0:4]
m1=np.mean(Iris1,axis=0)
m2=np.mean(Iris2,axis=0)
m3=np.mean(Iris3,axis=0)
s1=np.zeros((4,4))
s2=np.zeros((4,4))
s3=np.zeros((4,4))
for i in range(0,30,1):a=Iris1[i,:]-m1a=np.array([a])b=a.Ts1=s1+np.dot(b,a)
for i in range(0,30,1):c=Iris2[i,:]-m2c=np.array([c])d=c.Ts2=s2+np.dot(d,c) #s2=s2+np.dot((Iris2[i,:]-m2).T,(Iris2[i,:]-m2))
for i in range(0,30,1):a=Iris3[i,:]-m3a=np.array([a])b=a.Ts3=s3+np.dot(b,a)
sw12=s1+s2
sw13=s1+s3
sw23=s2+s3
#投影方向
a=np.array([m1-m2])
sw12=np.array(sw12,dtype='float')
sw13=np.array(sw13,dtype='float')
sw23=np.array(sw23,dtype='float')
#判别函数以及T
#需要先将m1-m2转化成矩阵才能进行求其转置矩阵
a=m1-m2
a=np.array([a])
a=a.T
b=m1-m3
b=np.array([b])
b=b.T
c=m2-m3
c=np.array([c])
c=c.T
w12=(np.dot(np.linalg.inv(sw12),a)).T
w13=(np.dot(np.linalg.inv(sw13),b)).T
w23=(np.dot(np.linalg.inv(sw23),c)).T
#print(m1+m2) #1x4维度  invsw12 4x4维度  m1-m2 4x1维度
T12=-0.5*(np.dot(np.dot((m1+m2),np.linalg.inv(sw12)),a))
T13=-0.5*(np.dot(np.dot((m1+m3),np.linalg.inv(sw13)),b))
T23=-0.5*(np.dot(np.dot((m2+m3),np.linalg.inv(sw23)),c))
kind1=0
kind2=0
kind3=0
newiris1=[]
newiris2=[]
newiris3=[]
for i in range(30,49):x=Iris1[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)kind1=kind1+1elif g12<0 and g23>0:newiris2.extend(x)elif g13<0 and g23<0 :newiris3.extend(x)
#print(newiris1)
for i in range(30,49):x=Iris2[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)elif g12<0 and g23>0:newiris2.extend(x)kind2=kind2+1elif g13<0 and g23<0 :newiris3.extend(x)
for i in range(30,50):x=Iris3[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)elif g12<0 and g23>0:     newiris2.extend(x)elif g13<0 and g23<0 :newiris3.extend(x)kind3=kind3+1
correct=(kind1+kind2+kind3)/60
print("样本类内离散度矩阵S1:",s1,'\n')
print("样本类内离散度矩阵S2:",s2,'\n')
print("样本类内离散度矩阵S3:",s3,'\n')
print('-----------------------------------------------------------------------------------------------')
print("总体类内离散度矩阵Sw12:",sw12,'\n')
print("总体类内离散度矩阵Sw13:",sw13,'\n')
print("总体类内离散度矩阵Sw23:",sw23,'\n')
print('-----------------------------------------------------------------------------------------------')
print('判断出来的综合正确率:',correct*100,'%')

(二)运行结果


总的来说Fisher判别的算法是比较准确地,实现的代码也相对比较简单,还有很多其他的判别算法,这里就只介绍了Fisher的判别,有兴趣的话可以看一下其他的算法。

利用Python代码完成Fisher判别的推导相关推荐

  1. python代码完成Fisher判别

    文章目录 一.算法描述 (1)W的确定 (2)阈值的确定 (3)Fisher线性判别的决策规则 二.数据描述 1.iris数据 2.sonar数据 三.鸢尾花数据集例子 四.python代码推导 1. ...

  2. Fisher判别的推导概念和过程+python代码实现(三分类)

    python代码完成Fisher判别的推导 一.Fisher算法的主要思想 二.Fisher数学算法步骤 ①计算各类样本均值向量 m i m_i mi​, m i m_i mi​是各个类的均值, N ...

  3. python爬虫背景_利用Python代码实现一键抠背景功能

    前言 又是一个逛csdn发现的一个有趣的小项目,可以一键抠背景,需要用到removebg模块及其API,API可从其官网免费获取,网址如下https://www.remove.bg/zh ps:加上/ ...

  4. python实现背景抠除_利用Python代码实现一键抠背景功能

    这篇文章主要给大家介绍了关于如何利用Python代码实现一键抠背景的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前 ...

  5. python计算器程序_利用Python代码编写计算器小程序

    1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 def __init__(self):8 #创建主界面 9 ...

  6. python12306买票_利用python代码写的12306订票代码

    本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考. 具体实现方法如下: import datetime import json import re import sys im ...

  7. python读取文件特定内容_利用python代码获取文件特定的内容,并保存为文档

    import os.path import re # 1 遍历指定目录,显示目录下的所有文件名 def each_file(file_path): path_dir = os.listdir(file ...

  8. 你绝对没见过的船新版本,利用Python代码制作过年春联。

    大家好我是渣渣辉,呸不好意思,最近广告看多了,大家好我是北凡春节来了兄弟们,it程序员的快乐就是用代码码出一切,这里呢教兄弟们一个好玩又简单的春联代码, 一.春联一 1.代码展示 index.html ...

  9. 利用Python 代码实现人体肤色检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:机器算法那些事 概述 本文中的人体肤色检测功能采用 Op ...

  10. 利用python代码 之 使用谷歌浏览器打开百度

    我想在这里插一个视频,网上没查到方法,有人知道可以告诉我吗?非常感谢!!! 所以我只能采用下面的笨方法啦 效果如下: 写上代码: 右键点运行 然后就会刷的一下,自动打开百度啦: 代码如下: #导入模块 ...

最新文章

  1. ASP.NET Core Web Razor Pages系列教程:使用ASP.NET Core创建Razor Pages Web应用程序
  2. android在Service,BroadCast onReceiver()中弹出Dialog对话框
  3. 轻松自动化---selenium-webdriver(python) (九)
  4. 电脑下载的M4A格式文件怎么转换为MP3格式
  5. mysql 磁盘i o 优化_经典案例:磁盘I/O巨高排查全过程
  6. xpath以某个字符开始_XPATH简单使用
  7. Django ORM QuerySet集合对象的特性
  8. Linux使用socket选项的定时器
  9. SAP QM 可以控制到没有收到Vendor 的certificate的话就不能做UD.
  10. php查netstat,Netstat命令详解
  11. 4 软件业务分析要点
  12. Springboot+CAS下Session过期无效,页面请求302问题解决
  13. web前端期末大作业网课设计与实现 _简单DIV布局旅游网页——简洁的旅游酒店公寓(15页)HTML+CSS+JavaScript
  14. OFD文件结构--OFD.xml
  15. linux bt 命令行,linux命令行bt下载工具
  16. linux程序性能分析工具stap,《面向应用开发者的系统指南》CPU篇之使用systemtap分析进程的行为...
  17. OSError: [WinError 1455] 页面文件太小,无法完成操作 报错解决
  18. 如何在虚拟机里用win95\98上网
  19. Javascript基础之-强制类型转换(三) 1
  20. Android百度地图(地位和POI附近搜索)-仿微信、QQ地理位置的分享

热门文章

  1. Spring-web源码解析之HttpRequestHandler
  2. 10.卷1(套接字联网API)---SCTP 客户/服务器程序例子
  3. 148. php in_array()
  4. 132.Function Handing 函数
  5. 1.Magento的配置系统
  6. 在utf8和gb2312中 不同编码情况下,汉字 数字 英文占的字节数?
  7. 应用安全-Web安全-SSRF攻防
  8. 面试准备(集合部分)
  9. Ubuntu下RabbitMQ安装
  10. 粉丝关注数据库表的设计