题目:
要求:在UCI数据集上的Iris和sonar数据上验证算法的有效性;Iris数据3类,4维,150个数据;Sonar数据2类,60维,208个样本;
训练和测试样本有三种方式进行划分:(三选一)
1)将数据随机分训练和测试,多次平均求结果
2)k折交叉验证
3)留1法
(针对不同维数,画出曲线图;)
目录
一、基础知识
二、仿真实验
基础知识

如图所示,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

9589

被折叠的 条评论
为什么被折叠?



