Fisher辨别分析

news2024/11/17 13:52:18
  • 问题要求

在UCI数据集上的Iris和Sonar数据上验证算法的有效性。训练和测试样本有三种方式(三选一)进行划分:

(一) 将数据随机分训练和测试,多次平均求结果

(二)K折交叉验证

(三)留1法

针对不同维数,画出曲线图。

  • 问题分析

(一)数据集

1.Iris数据集是常用的分类实验数据集,由Fisher收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。

2.在Sonar数据集中有两类(字母“R”(岩石)和“M”(矿井)),分别有97个和111个数据,每个数据有60维的特征。这个分类任务是为了判断声纳的回传信号是来自金属圆柱还是不规则的圆柱形石头。

(二)Fisher线性判别分析

1.方法总括

Fisher线性判别方法可概括为把 d 维空间的样本投影到一条直线上,形成一维空间,即通过降维去解决两分类问题。如何根据实际数据找到一条最好的、最易于分类的投影方向,是 Fisher 判别方法所要解决的基本问题。

2. 求解过程

(1)核心思想

假设有一集合 D 包含 m 个 n 维样本{x1, x2, …, xm},第一类样本集合记为 D1,规模为 N1,第二类样本集合记为 D2,规模为 N2。若对 xi 的分量做线性组合可得标量:yi = wTxi(i=1,2,…,m)这样便得到 m 个一维样本 yi 组成的集合, 并可分为两个子集 D’1 和 D’2。计算阈值 yo,当 yi>yo 时判断 xi 属于第一类, 当 yi<yo 时判断 xi 属于第二类,当 yi=yo 时 xi 可判给任何一类或者拒收。(2)具体推导

相关书籍或网站上都有具体推导过程,这里不再赘述。

  (3)样本划分

采用留1法划分训练集和数据集,该方法是K折法的一种极端情况。

在K折法中,将全部训练集 S分成 k个不相交的子集,假设 S中的训练样例个数为 N,那么每一个子集有 N/k 个训练样例,相应的子集称作 {s1,s2,…,sk}。每次从分好的子集中里面,拿出一个作为测试集,其它k-1个作为训练集,根据训练训练出模型或者假设函数。然后把这个模型放到测试集上,得到分类率,计算k次求得的分类率的平均值,作为该模型或者假设函数的真实分类率。

当取K的值为样本个数N时,即将每一个样本作为测试样本,其它N-1个样本作为训练样本。这样得到N个分类器,N个测试结果。用这N个结果的平均值来衡量模型的性能,这就是留1法。在UCI数据集中,由于数据个数较少,采用留一法可以使样本利用率最高。

  • 仿真结果
  • 1.Iris数据集

由于Fisher分类器只能将样本划分为两类,则将三份数据两两分类并采取留1法进行划分。由仿真效果可看出划分界限十分明显,Fisher算法分类的表现较好。

  • 2.Sonar数据集

由仿真结果可看出,维度在30维之前时,纬度越高,Fisher判别的准确率越高;维度在30维之后,Fisher判别的准确率趋于稳定,在75%左右。

代码如下:

(1)iris数据集

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
print(mpl.get_backend())

Iris = pd.read_csv('iris.data', header=None, sep=',')

def Fisher(X1, X2, t):

    # 各类样本均值向量
    m1 = np.mean(X1, axis=0)
    m2 = np.mean(X2, axis=0)
    m1 = m1.reshape(4, 1)
    m2 = m2.reshape(4, 1)
    m = m1 - m2

    # 样本类内离散度矩阵
    s1 = np.zeros((4, 4))   # s1,s2此时均为数组
    s2 = np.zeros((4, 4))
    if t == 0:  # 第一种情况
            for i in range(0, 49):
                s1 += (X1[i].reshape(4, 1) - m1).dot((X1[i].reshape(4, 1) - m1).T)
            for i in range(0, 50):
                s2 += (X2[i].reshape(4, 1) - m2).dot((X2[i].reshape(4, 1) - m2).T)
    if t == 1:  # 第二种情况
            for i in range(0, 50):
                s1 += (X1[i].reshape(4, 1) - m1).dot((X1[i].reshape(4, 1) - m1).T)
            for i in range(0, 49):
                s2 += (X2[i].reshape(4, 1) - m2).dot((X2[i].reshape(4, 1) - m2).T)
    # 总类内离散度矩阵
    sw = s1 + s2
    sw = np.mat(sw, dtype='float')
    m = np.mat(m, dtype='float')
    # 最佳投影方向
    w = np.linalg.inv(sw).dot(m)

    # 在投影后的一维空间求两类的均值
    m1 = np.mat(m1, dtype='float')
    m2 = np.mat(m2, dtype='float')
    m_1 = (w.T).dot(m1)
    m_2 = (w.T).dot(m2)

    # 计算分类阈值w0
    w0 = -0.5 * (m_1 + m_2)

    return w, w0

def Classify(X,w,w0):
    y = (w.T).dot(X) + w0
    return y

#数据预处理
Iris = Iris.iloc[0:150,0:4]
iris = np.mat(Iris)

Accuracy = 0

iris1 = iris[0:50, 0:4]
iris2 = iris[50:100, 0:4]
iris3 = iris[100:150, 0:4]

G121 = np.ones(50)
G122 = np.ones(50)
G131 = np.zeros(50)
G132 = np.zeros(50)
G231 = np.zeros(50)
G232 = np.zeros(50)

# 留一法验证准确性
# 第一类和第二类的线性判别
count = 0
for i in range(100):
    if i <= 49:
        test = iris1[i]
        test = test.reshape(4, 1)
        train = np.delete(iris1, i, axis=0)
        w, w0 = Fisher(train, iris2, 0)
        if (Classify(test, w, w0)) >= 0:
            count += 1
            G121[i] = Classify(test, w, w0)
    else:
        test = iris2[i-50]
        test = test.reshape(4, 1)
        train = np.delete(iris2, i-50, axis=0)
        w, w0 = Fisher(iris1, train, 1)
        if (Classify(test, w, w0)) < 0:
            count += 1
            G122[i-50] = Classify(test, w, w0)
Accuracy12 = count/100
print("第一类和二类的分类准确率为:%.3f"%(Accuracy12))

# 第二类和第三类的线性判别
count = 0
for i in range(100):
    if i <= 49:
        test = iris2[i]
        test = test.reshape(4, 1)
        train = np.delete(iris2, i, axis=0)
        w, w0 = Fisher(train, iris3, 0)
        if (Classify(test, w, w0)) >= 0:
            count += 1
            G231[i] = Classify(test, w, w0)
    else:
        test = iris3[i-50]
        test = test.reshape(4, 1)
        train = np.delete(iris3, i-50, axis=0)
        w, w0 = Fisher(iris2, train, 1)
        if (Classify(test, w, w0)) < 0:
            count += 1
            G232[i-50] = Classify(test, w, w0)
Accuracy23 = count/100
print("第二类和第三类的分类准确率为:%.3f"%(Accuracy23))

# 第一类和第三类的线性判别
count = 0
for i in range(100):
    if i <= 49:
        test = iris1[i]
        test = test.reshape(4, 1)
        train = np.delete(iris1, i, axis=0)
        w, w0 = Fisher(train, iris3, 0)
        if (Classify(test, w, w0)) >= 0:
            count += 1
            G131[i] = Classify(test, w, w0)
    else:
        test = iris3[i-50]
        test = test.reshape(4, 1)
        train = np.delete(iris3, i-50, axis=0)
        w,w0 = Fisher(iris1, train, 1)
        if (Classify(test, w, w0)) < 0:
            count += 1
            G132[i-50] = Classify(test, w, w0)
Accuracy13 = count/100
print("第一类和第三类的分类准确率为:%.3f"%(Accuracy13))

# 作图
y1 = np.zeros(50)
y2 = np.zeros(50)
plt.figure(1)
plt.ylim((-0.5, 0.5))

# 画散点图
plt.scatter(G121, y1, color='red', marker='.')
plt.scatter(G122, y2, color='blue', marker='.')
plt.xlabel('Class:1-2')
plt.show()

plt.figure(2)
plt.ylim((-0.5, 0.5))
# 画散点图
plt.scatter(G231, y1, c='red',  marker='.')
plt.scatter(G232, y2, c='blue', marker='.')
plt.xlabel('Class:2-3')
plt.show()

plt.figure(3)
plt.ylim((-0.5, 0.5))
# 画散点图
plt.scatter(G131, y1, c='red', marker='.')
plt.scatter(G132, y2, c='blue', marker='.')
plt.xlabel('Class:1-3')
plt.show()

(2)Sonar数据集

import numpy
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

path=r'sonar.all-data.txt'
df = pd.read_csv(path, header=None, sep=',')

def Fisher(X1, X2, n, t):

    # 各类样本均值向量
    m1 = np.mean(X1, axis=0)
    m2 = np.mean(X2, axis=0)
    m1 = m1.reshape(n, 1)
    m2 = m2.reshape(n, 1)
    m = m1 - m2
    # 样本类内离散度矩阵
    s1 = np.zeros((n, n))   # s1,s2此时均为数组
    s2 = np.zeros((n, n))
    if t == 0:  # 第一种情况
        for i in range(0, 96):
            s1 += (X1[i].reshape(n, 1) - m1).dot((X1[i].reshape(n, 1) - m1).T)
        for i in range(0, 111):
            s2 += (X2[i].reshape(n, 1) - m2).dot((X2[i].reshape(n, 1) - m2).T)
    if t == 1:  # 第二种情况
        for i in range(0, 97):
            s1 += (X1[i].reshape(n, 1) - m1).dot((X1[i].reshape(n, 1) - m1).T)
        for i in range(0, 110):
            s2 += (X2[i].reshape(n, 1) - m2).dot((X2[i].reshape(n, 1) - m2).T)

    # 总类内离散度矩阵
    sw = s1 + s2
    sw = np.mat(sw, dtype='float')
    m = numpy.mat(m, dtype='float')

    # 最佳投影方向
    w = np.linalg.inv(sw).dot(m)

    # 在投影后的一维空间求两类的均值
    m_1 = (w.T).dot(m1)
    m_2 = (w.T).dot(m2)

    # 计算分类阈值w0
    w0 = -0.5 * (m_1 + m_2)

    return w, w0

def Classify(X,w,w0):
    y = (w.T).dot(X) + w0
    return y

# 数据预处理
Sonar = df.iloc[0:208,0:60]
sonar = np.mat(Sonar)

# 分十次计算准确率
Accuracy = np.zeros(60)
accuracy_ = np.zeros(10)
for n in range(1,61):
    for t in range(10):
        sonar_random = (np.random.permutation(sonar.T)).T   # 对原sonar数据进行每列打乱

        sonar1 = sonar_random[0:97, 0:n]
        sonar2 = sonar_random[97:208, 0:n]

        count = 0
        # 留一法验证准确性
        for i in range(208):    # 取每一维度进行测试
            if i <= 96:
                test = sonar1[i]
                test = test.reshape(n, 1)
                train = np.delete(sonar1, i, axis=0)
                w, w0 = Fisher(train, sonar2, n, 0)
                if (Classify(test, w, w0)) >= 0:
                    count += 1
            else:
                test = sonar2[i-97]
                test = test.reshape(n, 1)
                train = np.delete(sonar2, i-97, axis=0)
                w, w0 = Fisher(sonar1, train, n, 1)
                if (Classify(test, w, w0)) < 0:
                    count += 1
        accuracy_[t] = count / 208
    for k in range(10):
        Accuracy[n - 1] += accuracy_[k]
    Accuracy[n - 1] = Accuracy[n - 1] / 10
    print("数据为%d维时,准确率为:%.3f" % (n, Accuracy[n - 1]))

# 作图
x = np.arange(1, 61, 1)
plt.xlabel('dimension')
plt.ylabel('Accuracy')
plt.ylim((0.5, 0.8))            # y坐标的范围
plt.plot(x, Accuracy, 'b')
plt.show()

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

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

相关文章

Vuex存值取值与异步请求处理

目录 前言 一、Vuex简介 1.Vuex是什么 2.Vuex的核心概念 3.使用Vuex的好处 4.Vuex执行流程 二、Vuex的使用步骤 1.安装Vuex 2.创建store模块&#xff0c;分别维护state/actions/mutations/getters 3.使用Vuex存储值&#xff0c;获取值和改变值 1.state.js---存值 2.…

【AI】深度学习——前馈神经网络——卷积神经网络

文章目录 1.2 卷积神经网络1.2.1 卷积一维卷积近似微分低通滤波器/高通滤波器卷积变种 二维卷积卷积的核心就是翻转相乘卷积应用于图像处理 互相关互相关代替卷积 卷积与互相关的交换性 1.2.2 卷积神经网络卷积代替全连接卷积层特征映射卷积层结构参数数量 汇聚层(池化层)汇聚层…

C语言,洛谷题,压缩技术2.0

题目如下&#xff1a; 这题用C语言实现有一些难度&#xff0c;要用到一个库函数&#xff0c;strcat&#xff08;头文件是string.h&#xff09;&#xff0c;用于连接两个字符串数组&#xff0c;strcat(str,arr)就是将arr字符数组后面的\0清除&#xff0c;再将arr字符拼接到str上…

python之K线模式识别

1、晨星 晨星也称作早晨之星&#xff0c;它是一种三日形态的K线组合&#xff0c;第一日是阴线&#xff0c;第二日价格振幅较小&#xff0c;第三日出现阳线&#xff0c;它的一般形态如下图所示。晨星的K线组合形态一般出现在下跌的趋势之后&#xff0c;预示着价格的上升回调。其…

网络-HTTPS

文章目录 前言一、HTTPS简介优点SSL/TSL工作流程 加密1、对称加密2、非对称加密 二、使用HTTPS1.openSSL生成私钥&#xff08;1&#xff09;node服务端&#xff08;2&#xff09;nginx配置https服务&#xff08;前端&#xff09; nginx服务 总结 前言 Http 存在不安全、无状态…

校园贴吧微信小程序搭建教程

大家好啊&#xff0c;罗峰今天来分享一下如何搭建一个校园贴吧微信小程序。一起来看看吧。 开发流程如下&#xff1a; 1.小程序注册&#xff1a;使用微信开放平台账号登录&#xff0c;创建一个新的小程序&#xff0c;并记录下小程序的 AppID。 2.项目初始化&#xff1a;使用微…

上海亚商投顾:沪指冲高回落 华为概念股持续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日高开低走&#xff0c;创业板指冲高回落。华为产业链继续活跃&#xff0c;鸿蒙方向领涨&#xff0c;润…

Idea创建springboot工程的时候,发现pom文件没有带<parent>标签

今天创建springboot工程&#xff0c;加载maven的时候报错&#xff1a; 这个问题以前遇到过&#xff0c;这是因为 mysql-connector-j 没有带版本号的原因&#xff0c;但是springboot的依赖的版本号不是都统一交给spring-boot-starter-parent管理了吗&#xff0c;为什么还会报错&…

CSS-注册页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title><style>*{margin:0px;padding: 0px;box-sizing: border-box;}body{background: url("../image/img/register_bg.png…

OpenCV实现图像傅里叶变换

傅里叶变换 dftcv.dft(img_float32,flagscv.DFT_COMPLEX_OUTPUT): flags:标志位&#xff0c;指定变换类型&#xff0c;cv.DFT_COMPLEX_OUTPUT会返回复数结果。 傅立叶变换&#xff0c;将输入的图像从空间域转换到频率域。 返回结果: 此函数返回一个复杂数值数组&#xff0c…

多尺度retinex图像去雾算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd)); rng(default)img_in im2doub…

Android 10.0 framework层实现app默认全屏显示

1.前言 在10.0的系统开发中,在对于第三方app全屏显示的功能需求开发中,需要默认app全屏显示,针对这一个要求,就需要在系统启动app 的过程中,在绘制app阶段就设置全屏属性,接下来就实现这个功能 效果图如下: 2.framework层实现app默认全屏显示的核心类 frameworks\base\…

Webapck 解决:[webpack-cli] Error: Cannot find module ‘vue-loader/lib/plugin‘ 的问题

1、问题描述&#xff1a; 其一、报错为&#xff1a; [webpack-cli] Error: Cannot find module vue-loader/lib/plugin 中文为&#xff1a; [webpack-cli] 错误&#xff1a;找不到模块“vue-loader/lib/plugin” 其二、问题描述为&#xff1a; 在项目打包的时候 npm run …

gitbook使用

文章目录 前言一、安裝Node.js&#xff1a;二、安裝GitBook&#xff1a;編輯和創建內容&#xff1a;安装typora 前言 ubuntu20.04系统 一、安裝Node.js&#xff1a; 打開終端機&#xff08;Terminal&#xff09;。 使用以下命令來安裝Node.js和npm&#xff08;Node.js的包管…

大数据笔记-大数据处理流程

大家对大数据处理流程大体上认识差不多&#xff0c;具体做起来可能细节各不相同&#xff0c;一幅简单的大数据处理流程图如下&#xff1a; 1&#xff09;数据采集&#xff1a;数据采集是大数据处理的第一步。 数据采集面对的数据来源是多种多样的&#xff0c;包括各种传感器、社…

UGUI交互组件Slider

一.Slider对象的结构 对象介绍Slider附加Slider组件Background背景Fill Area填充范围Fill填充对象Handle Slider Area滑块移动范围Handle滑块 二.Slider组件属性 属性说明Fill Rect关联填充对象Handle Rect关联滑块对象Direction设置方向Min Value最大取值Max Value最小取值Wh…

Python高效实现网站数据挖掘

在当今互联网时代&#xff0c;SEO对于网站的成功至关重要。而Python爬虫作为一种强大的工具&#xff0c;为网站SEO带来了革命性的改变。通过利用Python爬虫&#xff0c;我们可以高效地实现网站数据挖掘和关键词分析&#xff0c;从而优化网站的SEO策略。本文将为您详细介绍如何利…

用例图 UML从入门到放弃系列之三

1.说明 关于用例图&#xff0c;这篇文章我将直接照搬罗伯特.C.马丁老爷子在《敏捷开发》一书种的第17章&#xff0c;并配上自己的理解&#xff0c;因为这一章写的实在是太精彩了&#xff0c;希望能够分享给大家&#xff0c;共勉。以下是老爷子的原文中文翻译以及豆芽的个人解读…

迁移学习--预训练微调

目录 1、迁移学习作用 2、迁移学习的途径 3、相关的领域 4、在计算机视觉中的应用 5、迁移学习的办法 预训练模型 微调 6、总结 1、迁移学习作用 定义&#xff1a;能在一个任务学习一个模型&#xff0c;然后用来解决相关的别的任务&#xff0c;这样我们在一个地方花…

鸿运主动安全云平台任意文件下载漏洞

一、漏洞描述 深圳市强鸿电子有限公司鸿运主动安全云平台存在任意文件下载漏洞&#xff0c;攻击者可通过此漏洞下载敏感文件信息&#xff0c;获取数据库账号密码&#xff0c;从而为下一步攻击做准备。 二、网络空间搜索引擎查询 fofa查询 body"./open/webApi.html"…