Fisher线性判别器 python实现 实验报告

实验目的

       为了进一步理解和掌握Fisher线性判别法的基本原理和实现过程,利用Fisher判别法解决实际问题进行试验。

实验环境

Windows 10,Python 3.7.4,PyCharm 2019.2.3

实验原理

       Fisher线性判别法的基本思想是:通过寻找一个投影方向(线性变换,线性组合),将高维问题降低到一维空间来解决,并且要求变换后的一维数据类间离散度尽可能大,类内离散度尽可能小,能够使得两类之间尽可能分开,各类的内部又能尽可能聚集,如图1-1。

       Fisher线性判别分析,就是通过给定的训练数据,确定投影方向W和阈值y0,即确定线性判别函数,然后根据这个线性判别函数,对测试数据进行测试,得到测试数据的类别。

基本参数:

1.在d维空间

(1)各类样本均值向量

(2)样本的类内离散度矩阵,总的类内离散度矩阵

(3)样本间类内离散度

2.在一维空间

(1)各类样本的均值

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Fisher线性判别是一种经典的分算法,它可以将数据投影到一个低维空间中,从而实现。在Python中,可以使用scikit-learn库来实现Fisher线性判别。具体实现步骤如下: 1. 导入需要的库: ```python from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score ``` 2. 生成数据集: ```python X, y = make_classification(n_samples=100, n_features=10, n_classes=2, random_state=42) ``` 3. 划分训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=42) ``` 4. 训练模型: ```python lda = LinearDiscriminantAnalysis() lda.fit(X_train, y_train) ``` 5. 预测测试集: ```python y_pred = lda.predict(X_test) ``` 6. 计算准确率: ```python accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) ``` 以上就是Fisher线性判别Python实现步骤。 ### 回答2: Fisher线性判别Fisher Linear Discriminant,简称FLD)又叫做Fisher判别分析(Fishers Discriminant Analysis,简称FDA),是一种常用的分方法。其主要目的是将p维数据降到k维(k<p),以便于分Fisher线性判别最早是由1936年英国统计学家Ronald A. Fisher提出的,其思想是寻找一组投影变换,使得变换后的数据能够更好地区分不同的别。 在Python实现Fisher线性判别,可以使用Scikit-learn包中的LinearDiscriminantAnalysis。这个可以用于分问题,也可以用于降维问题中,具体用法如下: 1. 导入相关库: from sklearn.datasets import make_classification from sklearn.discriminant_analysis import LinearDiscriminantAnalysis import matplotlib.pyplot as plt 2. 生成模拟数据: X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, n_classes=2, random_state=42) 3. 对数据进行FLD降维: lda = LinearDiscriminantAnalysis(n_components=1) X_lda = lda.fit_transform(X, y) 4. 可视化结果: fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10,5)) ax[0].scatter(X[:, 0], X[:, 1], c=y) ax[0].set_title('Original Data') ax[1].scatter(X_lda[:, 0], [0]*len(X_lda), c=y) ax[1].set_title('LDA Data') plt.show() 在上述代码中,首先使用make_classification函数生成一个二分的模拟数据,然后使用LinearDiscriminantAnalysis数据进行FLD降维。最后通过可视化结果对比原始数据和FLD降维后的数据,从而看出降维的效果。 总体来说,Fisher线性判别是一种比较常用的降维方法,它可以帮助我们提高分的精度,同时也可以减少运算的时间和空间复杂度。在Python实现Fisher线性判别非常方便,只需要导入Scikit-learn包中的LinearDiscriminantAnalysis,并使用该提供的函数即可实现。 ### 回答3: Fisher线性判别是一种二分算法,主要用于对数值型数据进行分。它的目标是找到一个线性投影,将样本从高维特征空间投射到低维空间,在低维空间中进行分。该算法的核心思想是将样本投影到一条直线上,使得不同别的样本在投影后的结果中尽可能分开。具体步骤如下: 1. 将样本集按别分开,得到两个别的样本矩阵 X1 和 X2。 2. 分别求出两个别的样本均值向量。m1 = mean(X1),m2 = mean(X2)。 3. 计算两个别的散度矩阵 S1 和 S2。S1 = (X1 - m1) * (X1 - m1).T,S2 = (X2 - m2) * (X2 - m2).T。 4. 计算内散度矩阵 Sw = S1 + S2。 5. 计算投影向量 w,使得内散度矩阵 Sw 最小,间散度矩阵 Sb 最大。w = inv(Sw) * (m1 - m2)。 6. 将样本 X 分别投影到直线 w 上,得到低维空间的样本 Y = w.T * X。 7. 根据低维空间的 Y 值进行分。 以下是 Fisher 线性判别Python 代码实现: ```python import numpy as np class Fisher: def __init__(self): self.w = None def fit(self, X, y): # 按别分离样本 X1 = X[y==0] X2 = X[y==1] # 计算样本均值向量 m1 = np.mean(X1, axis=0) m2 = np.mean(X2, axis=0) # 计算内散度矩阵 Sw 和间散度矩阵 Sb Sw = np.cov(X1.T) + np.cov(X2.T) Sb = np.outer(m1 - m2, m1 - m2) # 计算投影向量 w self.w = np.linalg.inv(Sw).dot(m1 - m2) def predict(self, X): # 将样本投影到直线上 Y = X.dot(self.w.T) # 根据低维空间的值进行分 return (Y > 0).astype(int) ``` 在这段代码中,我们使用了 numpy 库的 cov 函数计算样本协方差矩阵,还使用了 dot 函数计算投影向量和矩阵乘法。通过 fit 函数训练模型,predict 函数进行预测,我们可以很方便地实现 Fisher 线性判别算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值