Fisher线性判别分析;python实现,iris&sonar数据集

该文章已生成可运行项目,

题目:

要求:在UCI数据集上的Iris和sonar数据上验证算法的有效性;Iris数据3类,4维,150个数据;Sonar数据2类,60维,208个样本;

训练和测试样本有三种方式进行划分:(三选一)

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

2)k折交叉验证

3)留1法

(针对不同维数,画出曲线图;)


目录

题目:

一、基础知识

二、仿真实验

2.1对数据集的分析

2.2 Sonar代码

2.2 iris代码

三、实验结果分析

3.1Sonar

3.2 iris

四、总结及疑问


基础知识

如图所示,Fisher线性判别分析的最重要的作用是将数据降维。用一句话总结就是:用数学上的闭合解,去二分类问题。所以Fisher的核心问题是,这个确切的闭合解是如何求得的。首先引入几个必要的概念:均值、类内离散度、类间离散度。


作为二分类问题,期望的是类内离散度最小,类间离散度最大。所以准则函数可以定义如下:

对于J(w)的求解可以概括为两步:1.将J(w)函数转换为显性方程。2.使用拉格朗日乘子法求梯度。

通过计算可以得知,w*只和Sw^-1*(u1 – u2)相关。

至此就可以开始写程序了。

仿真实验

2.1对数据集的分析

数据集采用sonar以及iris两个数据集。

Sonar:两类; 208行61列,对应前97行R(Rock)和 后111行M(Mine)。

Iris:三类; 150行5列,前4列分别为花萼长度、花萼宽度、花瓣长度、花瓣宽度; 最后一列为标签。每类50个样本。


本实验中两数据集上都采用留一法验证。

对于Sonar数据集来说,由于sonar一共有60维,因此程序中分别取1,2,3…60维,分别验证每个维度对正确率的影响。

对于iris数据集来说,由于Fisher只可以进行二分类问题,因此将数据分为了12,13,23三个二分类问题。

2.2 Sonar代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def Fisher(x1, x2, n, c):
    #计算各类均值
    u1 = np.mean(x1, axis=0)
    u2 = np.mean(x2, axis=0)
    # u1 = u1.reshape(-1, 1)
    # u2 = u2.reshape(-1, 1)
    
    #计算S1,S2,类内离散度矩阵
    S1 = np.zeros((n, n))
    S2 = np.zeros((n, n))
    if c == 0:                          # 第一种情况
        for i in range(0,96):
            S1 += (x1[i].reshape(-1, 1)-u1).dot((x1[i].reshape(-1, 1)-u1).T)
        for i in range(0,111):
            S2 += (x2[i].reshape(-1, 1)-u2).dot((x2[i].reshape(-1, 1)-u2).T)
    if c == 1:
        for i in range(0,97):
            S1 += (x1[i].reshape(-1, 1)-u1).dot((x1[i].reshape(-1, 1)-u1).T)
        for i in range(0,110):
            S2 += (x2[i].reshape(-1, 1)-u2).dot((x2[i].reshape(-1, 1)-u2).T)

    #计算Sw
    Sw = S1 + S2
    
    #计算W以及W0
    W = np.linalg.inv(Sw) @ (u1 - u2)
    u_1 = u1.T @ W                            #投影在一维的均值
    u_2 = u2.T @ W
    W0 = -0.5 * (u_1 + u_2)                 #分界点
    
    return W, W0
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

End!ess

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值