Fisher 准则分类

news2025/1/16 5:40:50

目录

一、什么是Fisher 准则

二、具体实例

三、代码实现

四、结果


一、什么是Fisher 准则

Fisher准则,即Fisher判别准则(Fisher Discriminant Criterion),是统计学和机器学习中常用的一种分类方法,由统计学家罗纳德·费师(Ronald Fisher)在1936年提出。它的主要目的是找到一个特定的方向,通过将数据投影到这个方向上,使得不同类别的数据在这个新的维度上能够实现最好的分类效果。

Fisher准则的核心思想是:

  • 最大化不同类别数据的均值之间的距离。
  • 同时最小化每个类别内部数据的方差。

二、具体实例

已知有两类二维样本数据如下:

w1 中数据点的坐标对应:

x1 = 0.23, 1.52, 0.65, 0.77, 1.05, 1.19,

0.29, 0.25, 0.66, 0.56, 0.90, 0.13,

-0.54, 0.94, -0.21, 0.05, -0.08, 0.73,

0.33, 1.06, -0.02, 0.11, 0.31, 0.66

y1 = 2.34, 2.19, 1.67, 1.63, 1.78, 2.01,

2.06, 2.12, 2.47, 1.51, 1.96, 1.83,

1.87, 2.29, 1.77, 2.39, 1.56, 1.93,

2.20, 2.45, 1.75, 1.69, 2.48, 1.72

W2 中数据点的坐标对应:

x2 = 1.40, 1.23, 2.08, 1.16, 1.37, 1.18,

1.76, 1.97, 2.41, 2.58, 2.84, 1.95,

1.25, 1.28, 1.26, 2.01, 2.18, 1.79,

1.33, 1.15, 1.70, 1.59, 2.93, 1.46

y2 = 1.02, 0.96, 0.91, 1.49, 0.82, 0.93,

1.14, 1.06, 0.81, 1.28, 1.46, 1.43,

0.71, 1.29, 1.37, 0.93, 1.22, 1.18,

0.87, 0.55, 0.51, 0.99, 0.91, 0.71

1)利用上面数据确定并画出 Fisher 准则下的最优投影方向,给出分类阈值。

2)根据所得结果判断(1,1.5),(1.2,1.6),(2.0,0.9),(1.2,1.3),(0.232.7, 并画出数据分类相对应的结果图,要求画出其在 W 上的投影。

三、代码实现

import numpy as np
import math
import matplotlib.pyplot as plt
x1=[0.23,1.52,0.65,0.77,1.05,1.19,0.29,0.25,0.66,0.56,0.90,0.13,-0.54,0.94,-0.21,0.05,-0.08,0.73,0.33,1.06,-0.02,0.11,0.31,0.66]
y1=[2.34,2.19,1.67,1.63,1.78,2.01,2.06,2.12,2.47,1.51,1.96,1.83,1.87,2.29,1.77,2.39,1.56,1.93,2.20,2.45,1.75,1.69,2.48,1.72]
x2=[1.40,1.23,2.08,1.16,1.37,1.18,1.76,1.97,2.41,2.58,2.84,1.95,1.25,1.28,1.26,2.01,2.18,1.79,1.33,1.15,1.70,1.59,2.93,1.46]
y2=[1.02,0.96,0.91,1.49,0.82,0.93,1.14,1.06,0.81,1.28,1.46,1.43,0.71,1.29,1.37,0.93,1.22,1.18,0.87,0.55,0.51,0.99,0.91,0.71]
#将矩阵整合为w1、w2
w1=[[0 for i in range(2)]for i in range(24)]
w2=[[0 for i in range(2)]for i in range(24)]
for i in range(24):
    w1[i][0]=x1[i]
    w1[i][1]=y1[i]
    w2[i][0]=x2[i]
    w2[i][1]=y2[i]
print('整合矩阵w1 w2')
print(w1)
print(w2)
#计算两类均值向量
m1=np.mean(w1,0)#mean(matrix,axis=0),matrix填写一个矩阵,axis 0代表:压缩行,对各列求均值
m2=np.mean(w2,0)#axis 1代表:压缩列,对各行求均值
print('计算两类均值向量')
print(m1)
print(m2)

#计算总的类内离散度矩阵Sw=s1+s2
s10=[0,0]
s20=[0,0]
s1=[[0 for i in range(2)]for j in range(2)]#2*2
s2=[[0 for i in range(2)]for j in range(2)]
for i in range(24):#这里要注意矩阵的转置
    s10[0]=(w1[i][0]-m1[0])
    s10[1]=(w1[i][1]-m1[1])
    s11=np.mat(s10)#将list变为矩阵
    s1+=np.mat((s11.T)*s11)#这里和书上公式相反,因为设置的时候和书上不一样,想到得到2*2的矩阵就必须换个方向
    s20[0]=(w2[i][0]-m2[0])
    s20[1]=(w2[i][1]-m2[1])
    s22=np.mat(s20)
    s2+=np.mat((s22.T)*s22)
print('s1')
print(s1)
print('s2')
print(s2)
sw=s1+s2
print('sw')
print(sw)

#计算投影方向和阈值
w_new=(np.mat(sw)).I*(np.mat((m1-m2)).T)
print('w_new')
print(w_new)
#这里因为考虑先验概率
m1_new=m1*w_new#这里的顺序很重要,因为前面设置的时候没有注意,所以写的时候要注意一下
m2_new=m2*w_new
pw1=0.6
pw2=0.4
w0=(m1_new+m2_new)/2-math.log(pw1/pw2)/(24+24-2)
print('w0')
print(w0)

#对测试数据进行分类判别
x=[[1,1.5],[1.2,1.0],[2.0,0.9],[1.2,1.5],[0.23,2.33]]
result1=[]
result2=[]
for i in range(5):
    y=np.mat(x[i])*w_new#这里的顺序依然要小心
    if y>w0[0][0]:
        result1.append(x[i])
    else:
        result2.append(x[i])
print('result1')
print(result1)
print('result2')
print(result2)

#计算试验点在w_new方向上的点
w_k=np.mat(np.zeros((2,1)))#归一化
w_k[0]=w_new[0]/(np.linalg.norm(w_new,ord=2,axis=None,keepdims=False))#使用二范数进行归一化
w_k[1]=w_new[1]/(np.linalg.norm(w_new,ord=2,axis=None,keepdims=False))
print(w_k)
wd=np.mat(np.zeros((2,5)))
for i in range(5):
    wd[:,i]=(np.mat(x[i])*(w_k*w_k.T)).T
print('wd')
print(wd)

#显示分类结果
mw1=np.mat(w1)
mw2=np.mat(w2)
mr1=np.mat(result1)
mr2=np.mat(result2)
p1=plt.scatter(mw1[:,0].tolist(),mw1[:,1].tolist(),c='red',marker='+')#画出w1类的各点
p2=plt.scatter(mw2[:,0].tolist(),mw2[:,1].tolist(),c='green',marker='s')#画出w2类的各点
p3=plt.scatter(mr1[:,0].tolist(),mr1[:,1].tolist())#画出测试集中属于w1的各点
p4=plt.scatter(mr2[:,0].tolist(),mr2[:,1].tolist())#画出测试集中属于w2的各点
p5=plt.plot([0,10*w_new[0]],[0,10*w_new[1]])#画出最佳投影方向
p6=plt.scatter(wd.T[:,0].tolist(),wd.T[:,1].tolist(),c='g',marker='*')#画出测试集各点在投影方向上的投影点
plt.legend([p1,p2,p3,p4,p6],['w1','w2','result1','result2','lx'])
#plt.legend([p5],['line'])
plt.show()

四、结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1623178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【golang学习之旅】Go 的基本数据类型

系列文章 【golang学习之旅】报错:a declared but not used 目录 系列文章总览布尔型(bool)字符串型(string)整数型(int、uint、byte、rune)浮点型(float32、float64)复…

网络安全之防范钓鱼邮件

随着互联网的快速发展,新的网络攻击形式“网络钓鱼”呈现逐年上升的趋势,利用网络钓鱼进行欺骗的行为越来越猖獗,对互联网的安全威胁越来越大。网络钓鱼最常见的欺骗方式就是向目标群体发送钓鱼邮件,而邮件标题和内容,…

类的六个构造函数相关干货

构造函数 特点 1.名字与类名相同 2.无返回值 3.对象实例化的时候编译器自动调用这个函数 4.构造函数可以重载(无参构造函数,拷贝构造等) 5.如果类中没有显式定义构造函数(深拷贝),则编译器会自动生成一个…

OpenSPG v0.0.3 发布,新增大模型统一知识抽取图谱可视化

基于非结构化文档的知识构建一直是知识图谱大规模落地的关键难题之一,4 月 23 日,OpenSPG 发布 v0.0.3 版本,正式发布了大模型统一知识抽取功能,可大幅降低领域知识图谱的构建成本。还可用于增强大模型缓解幻觉并提升稳定性&#…

Spring Boot中判断轨迹数据是否经过设置的打卡点,且在PGSQL中把点拼接成线,判断某个点是否在线上或在线的50米范围内

问题描述 轨迹数据判断是否经过打卡点,轨迹数据太多,循环判断的话非常消耗内存。解决办法只需要把所有轨迹数据点拼成了一条线,然后只需要循环打卡点即可,打卡点不多,一般不会超过100个,如果多的话&#x…

C++高级特性:异常概念与处理机制(十四)

1、异常的基本概念 异常:是指在程序运行的过程中发生的一些异常事件(如:除数为0,数组下标越界,栈溢出,访问非法内存等) C的异常机制相比C语言的异常处理: 函数的返回值可以忽略&…

C++ | Leetcode C++题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; class Solution { public:int firstMissingPositive(vector<int>& nums) {int n nums.size();for (int i 0; i < n; i) {while (nums[i] > 0 && nums[i] < n && nums[nums[i] - 1] ! nums[i]) {swap(…

助力实现更可持续未来的智能解决方案:AI如何改变世界

人工智能已然成为今年的热门话题。由于生成式AI应用的快速采用&#xff0c;新闻头条充斥着有关AI如何彻底改变我们的政策制定、就业和经济走向的预测。您知道AI也是我们应对各种可持续发展挑战的先锋吗&#xff1f;AI通过分析大量数据&#xff0c;并提供有用的见解和工具&#…

Python | Leetcode Python题解之第44题通配符匹配

题目&#xff1a; 题解&#xff1a; class Solution:def isMatch(self, s: str, p: str) -> bool:def allStars(st: str, left: int, right: int) -> bool:return all(st[i] * for i in range(left, right))def charMatch(u: str, v: str) -> bool:return u v or v…

半波整流220V转正5V负-5V100mA恒压WT5101A

半波整流220V转正5V负-5V100mA恒压WT5101A WT5101A 是一款专为 Buck 和 Buck-Boost 拓扑而设计的高效、具有成本优势的离线恒压稳压器&#xff0c;内嵌有500V MOSFET。在降低系统成本的同时&#xff0c;这款稳压器只需少量的外部元件就能输出默认的5V电压。在轻负载条件下&…

30kw 直流回馈老化测试负载箱的优点

直流回馈老化测试负载箱是一种专门用于对电源设备进行老化测试的设备&#xff0c;其主要优点如下&#xff1a; 直流回馈老化测试负载箱采用了先进的直流回馈技术&#xff0c;能够将测试过程中产生的电能回馈到电网中&#xff0c;大大提高了能源的利用效率。这种技术不仅能够节…

水电气能耗管理云平台

安科瑞薛瑶瑶18701709087/17343930412 能耗管理云平台采用泛在物联、云计算、大数据、移动通讯、智能传感器等技术手段可为用户提供能源数据采集、统计分析、能效分析、用能预警、设备管理等服务&#xff0c;平台可以广泛应用于多种领域。

微信小程序按钮点击时的样式hover-class=“hover“

小程序的button组件很好用&#xff0c;按钮点击的时候会显示点击状态&#xff0c;默认的就是颜色加深 但是我们改变了button的背景色之后&#xff0c;就看不出点击效果了&#xff0c;解决起来也很简单 关键代码就是小程序的 hover-class 属性&#xff0c;需要注意的是&#xff…

【java】27:java绘图

坐标体系 - 介绍&#xff1a; 下图说明了Java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中&#xff0c;第一个是x坐标&#xff0c;表示当前位置为水平方向&#xff0c;距离坐标原点个像素&#xff1b;第二个是y坐标&#xff0c;表示当前位置为垂直方向…

APP自动化测试-Android SDK SDK Manager.exe或者uiautomatorviewer.bat打不开,点击就一闪而已的原因

原因是找不到Java.exe的路径&#xff0c; 如果是uiautomatorviewer.bat打不开&#xff0c;则使用文本编辑器打开它&#xff0c;然后添加java安装路径 set java_exeC:\Program Files\Java\jdk1.8.0_321\bin\java.exe 同理&#xff1a; 如果是SDK Manager.exe和AVD Manager.ex…

2024全新Java学习路线图一条龙(视频+课件+源码资料)

前言 互联网浩瀚无际,你能来到这里,是机遇也是缘分,机遇,就像我的标题一样,你找到了一份Java 360度无死角的 Java 学习路线,而缘分让我们相遇,注定给你的学习之路搭上一把手,送你一程。 整条线路除了拥有后端整个技术体系外,还涵盖了前端、大数据、云计算、运维等各…

【telnet 命令安装】centos8 linux下安装telnet命令

在CentOS 8上安装Telnet服务&#xff0c;您需要分别安装Telnet客户端和服务器端。以下是安装步骤的概述&#xff1a; 检查是否已安装Telnet&#xff1a; 您可以使用rpm命令来检查系统是否已经安装了Telnet客户端或服务器端。例如&#xff1a; rpm -qa | grep telnet-client rpm…

OWASP发布十大开源软件安全风险及应对指南

​ 最近爆发的XZ后门事件&#xff0c;尽管未酿成Log4j那样的灾难性后果&#xff0c;但它再次敲响了警钟&#xff1a;软件供应链严重依赖开源软件&#xff0c;导致现代数字生态系统极其脆弱。面对层出不穷的安全漏洞&#xff0c;我们需要关注开源软件 (OSS)风险 &#xff0c;改进…

Web前端笔记1.0【Html详解,CSS详解】【Js待完善】

Web前端 html5 html5是构建web前端内容的一种语言描述方式 标签 标签分类 单标签&#xff1a;<input type text"> 双标签语法规范&#xff1a;<标签名> <标签名> 内容 </标签名></标签名> (可相互嵌套&#xff09; 常用标签 标题标…

在不使用PageHelper或Mybatis的情况下实现手动分页

有些特殊情况下我们不需要查库但前端数据需要分页&#xff0c;我们就需要手写分页实现&#xff0c;比如在线用户的功能我们可能会去Redis中查有哪些用户&#xff0c;然后返回给前端&#xff0c;但前端需要分页处理&#xff0c;我们就需要实现手动分页&#xff0c;话不多说直接上…