Fisher线性判别

一、算法介绍
1.背景:
在应用统计方法解决模式识别问题时,一再碰到的问题之一就是维度问题,在低维空间里解析上或计算上行得通的方法,在高维空间里往往行不通。降低维度有时会成为处理实际问题的关键。
对于两分类问题,考虑把d维空间的样本投影到一条直线上,形成一维空间,即把数据压缩到一维,同时保持好的分类性能。
对于d维空间的样本,投影到一维坐标上,样本特征将混杂在一起,难以区分。Fisher判别法的目的就是要找到一个最适合的投影轴w,使两类样本在该轴上投影的交叠部分最少,从而使分类效果最佳。

2.Fisher线性判别:
Fisher判别法所要解决的基本问题:如何根据实际数据找到一条最好的、最易于分类的投影方向。
Fisher准则函数的基本思路:向量w的方向选择应能使两类样本投影的均值之差尽可能大些,而使类内样本的离散程度尽可能小。

3.Fisher分类器设计:

二、数据集描述:
1、Sonar数据集:
这是一个通过声纳声音从不同曲面反弹后返回的信息判断物质是金属还是岩石的数据集。
这个数据集共有208条记录,每条数据记录了60种不同的声纳探测的数据和一个分类结果,若是岩石则标记为R,若是金属则标记为M。
2、iris数据集:
iris数据集包含3类共150条记录,每类50个数据,每条记录都有4项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这4个特征预测鸢尾花属于(iris-setosa,iris-versicolour,iris-virginica)中的哪一品种。

三、在sonar数据集上验证算法
1、分离数据集 — 划分训练样本和测试样本:
选择将数据随机分成训练和测试,测试结果取10次平均。
划分的过程如下:
首先将两类样本分开,之后进行10次循环,每次在顺序被打乱的样本中取出训练样本,剩下的数据作为测试样本。分别取R类训练样本73个,M类训练样本84个。(按照训练数据75%,测试数据25%)。
2、实现过程

import numpy as np
import pandas as pd
dataset = pd.read_csv('/(你的路径)/sonar.all-data',header=None)
array = dataset.values
X = array[:,0:60].astype(float)#数据
Y = array[:,60]#类别
sonar1 = X[:97]
sonar2 = X[97:]
a = []
for i in range(10):np.random.shuffle(sonar1)np.random.shuffle(sonar2)sonar1_train = sonar1[:73]sonar2_train = sonar2[:84]m1 = np.mean(sonar1,axis = 0)#计算样本均值m2 = np.mean(sonar2,axis = 0)mean_m1 = sonar1_train-m1#每类样本的类内离散度矩阵s1 = np.zeros((60,60))for i in range(73):t = mean_m1[i]s1 = s1 + t*t.reshape(60,1)mean_m2 = sonar2_train-m2s2 = np.zeros((60,60))for i in range(84):t = mean_m2[i]s2 = s2 + t*t.reshape(60,1)sw = s1+s2#总样本类内离散度矩阵sw = np.linalg.inv(sw)#w = np.dot((sw),(m1-m2))#最佳变换方向w0 = 0.5*(np.dot(w.T,m1+m2))#阈值#测试kind1 = 0kind2 = 0test1 = sonar1[73:]test2 = sonar2[84:]for i in range(24):y = np.dot(w.T,test1[i])if y>=w0:kind1 = kind1+1for i in range(27):y = np.dot(w.T,test2[i])if y<w0:kind2 = kind2+1correct = (kind1 +kind2)/51a.append(correct)
print(np.mean(a))
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dataset = pd.read_csv('/    /sonar.all-data',header=None)
array = dataset.values
#分离两类数据集
X = array[:,0:60].astype(float)#数据
Y = array[:,60]#类别
sonar1 = X[:97]
sonar2 = X[97:]
a = []
t1 = []
t2 = []
fig = plt.figure()
for i in range(10):count = i+1np.random.shuffle(sonar1)np.random.shuffle(sonar2)sonar1_train = sonar1[:73]sonar2_train = sonar2[:84]#计算样本均值m1 = np.mean(sonar1,axis = 0)m2 = np.mean(sonar2,axis = 0)#每类样本的类内离散度矩阵mean_m1 = sonar1_train-m1s1 = np.zeros((60,60))for i in range(73):t = mean_m1[i]s1 = s1 + t*t.reshape(60,1)mean_m2 = sonar2_train-m2s2 = np.zeros((60,60))for i in range(84):t = mean_m2[i]s2 = s2 + t*t.reshape(60,1)sw = s1+s2#最佳变换方向sw = np.linalg.inv(sw)w = np.dot((sw),(m1-m2))#阈值w0 = 0.5*(np.dot(w.T,m1+m2))#print(w0)#测试t1 = []t2 = []kind1 = 0kind2 = 0test1 = sonar1[73:]test2 = sonar2[84:]for i in range(24):y = np.dot(w.T,test1[i])t1.append(y)if y>=w0:kind1 = kind1+1#print(kind1)for i in range(27):y = np.dot(w.T,test2[i])t2.append(y)if y<w0:kind2 = kind2+1#print(kind2)correct = (kind1 +kind2)/51#print("第 %d 次测试的准确率:%d",%(count,correct))a.append(correct)#fig = plt.figure(figsize = (6,3))ax = fig.add_subplot(5,2,count)plt.ylim(0,2)#plt.xlabel("test data")b1 = [1 for i in range(24)]b2 = [1 for i in range(27)]plt.scatter(t1,b1,marker="*")plt.scatter(t2,b2,marker="^")plt.scatter(w0,1)plt.tight_layout()
plt.title("10 tests in sonar")
plt.show()
c = np.mean(a)
print("准确率:")
print(c)

结果分析:
由于sonar数据集维数过多,而数据量相对较少,所以实现的准确率不到80%。由课上讨论的 c=2(k+1) 可知,当训练数据达到1200时,可以取得很好的效果。Sonar数据集只有208条记录。

四、在iris数据集上验证算法
1、使用iris数据集的任意两类: 实现过程与sonar数据集的过程完全一致,只是在iris数据集上使用每50类数据中的随机30类作为训练数据,剩余为测试数据。

Fisher线性判别相关推荐

  1. fisher判别_经典模式识别:Fisher线性判别

    本文将介绍Fisher线性判别的原理和具体实践,阅读时间约8分钟,关注公众号可在后台领取数据集资源哦^-^ Fisher线性判别 1.背景介绍 生活中我们往往会遇到具有高维特性的数据,如个人信息,天气 ...

  2. Fisher线性判别算法原理及实现 MATLAB

    Fisher线性判别算法原理及实现 MATLAB 一.Fisher判别器原理 二.代码实现 clc; close all; clear; %% 生成数据 rng(2020); %指定一个种子 mu1 ...

  3. matlab fisher检验,FISHER线性判别MATLAB实现.doc

    FISHER线性判别MATLAB实现 Fisher线性判别上机实验报告 班级: 学号: 姓名: 算法描述 Fisher线性判别分析的基本思想:选择一个投影方向(线性变换,线性组合),将高维问题降低到一 ...

  4. Python 分类问题研究-Fisher线性判别

    [实验目的] 1.掌握常见机器学习分类模型思想.算法,包括Fisher线性判别.KNN.朴素贝叶斯.Logistic回归.决策树等: 2.掌握Python编程实现分类问题,模型评价指标.计时功能.保存 ...

  5. Fisher线性判别 模式识别 例题

    ** Fisher线性判别 ** [例4-1]本程序为纸币100元A面与50元A 面的Fisher判别门限的程序,通过全局变量 dat自动从样本数据中将内容读入dat[10][4][8][8][60] ...

  6. R语言 Fisher线性判别

    本人正在学习R语言,想利用这个平台记录自己一些自己的学习情况,方便以后查找,也想分享出来提供一些资料给同样学习R语言的同学们.(如果内容有错误,欢迎大家批评指正) Fisher线性判别主要用来根据样本 ...

  7. 朴素贝叶斯分类器与Fisher线性判别实践——水果识别为例

    开篇:本次博客主要分享二分类水果实现案例,样本构造显然不具备泛化.大数量特性以及背景均为纯白色是为了方便目标提取.大家若需要更好的水果样本,Github上有许多的优秀案例.本次代码计算效率较低,代码有 ...

  8. Fisher线性判别散度矩阵Sb,Sw 另一种表达形式的证明

    Fisher线性判别中散度矩阵的表现形式可以改写,类内散度: Sw=∑i=1c∑j:yj=i(xj−μi)(xj−μi)T=12∑i,jA(w)ij(xi−xj)(xi−xj)TSw=∑i=1c∑j: ...

  9. 基于fisher线性判别法的分类器设计

    0.引言说明 这篇文章实际上是楼主上的模式识别课程的课堂报告,楼主偷懒把东西直接贴出来了.选择fisher判别法的原因主要是想学习一下这个方法,这个方法属于线性判别法,操作起来和lda判别法近乎没啥区 ...

最新文章

  1. R语言数据包自带数据集之ISwR包的melanom数据集字段解释、数据导入实战
  2. 最全VR产业链全景图(必收藏)
  3. web报告工具FineReport在使用方法和解决方案常见错误遇到(一)
  4. 谈谈一些有趣的CSS题目(十六)-- 奇妙的 background-clip: text
  5. ice 服务java连接,“先进的互联互通技术”–使用ice联通php和java [part 1 server]
  6. 【Nginx】第一章 快速入门
  7. WAMPSERVER 启动后打开LOCALHOST是一张IIS7的图片的解决
  8. 教你快速运行谷歌EfficientDet目标检测
  9. Ubunbu新建的用户使用SecureCrt无法Table补全、无法高亮
  10. 图片拉动验证php,php拖动图片卡位验证码
  11. 搭建Linux的基础命令符---bc
  12. 数字图像处理 matlab 傅里叶变换及逆变换 余弦变换及逆变换(使用代码库)
  13. 货币单位PHP,PHP实现货币换算的方法_PHP
  14. Redis的前前后后左左右右
  15. 第 20 章 Document Tools
  16. 【信号与系统】(二十二)拉普拉斯变换与复频域分析——s域分析
  17. 深入了解OpenOffice.org(三)-- OpenOffice.org中的XML应用
  18. firefox firbug 的“阻挡”
  19. 精妙绝伦的脑洞acm题
  20. Dragger.android的使用

热门文章

  1. 后台推送消息给app_小米加入统一推送联盟!避免多种APP后台运行,国产手机春天来了...
  2. p0f - 被动探测操作系统工具
  3. 【使用两个队列实现栈】
  4. 将titles_test表名修改为titles_2017
  5. 对volatile关键字盲点感悟
  6. 「读书感悟系列」苏世民:我的经验与教训
  7. “大灯”到底指近光灯还是远光灯?
  8. 【CANoe】车载网络的相关概述
  9. android实现课程表界面
  10. 学习笔记1--过滤器代理