用python代码完成Fisher判别的推导

在理解Fisher线性分类的参考代码基础上(matlab代码),改用python代码完成Fisher判别的推导。重点理解“群内离散度”(样本类内离散矩阵)、“群间离散度”(总类内离散矩阵)的概念和几何意义。

一、Fisher线性判别

Fisher线性判别分析的基本思想:选择一个投影方向(线性变换,线性组合),将高维问题降低到一维问题来解决,同时变换后的一维数据满足每一类内部的样本尽可能聚集在一起,不同类的样本相隔尽可能地远。
Fisher线性判别分析,就是通过给定的训练数据,确定投影方向W和阈值w0, 即确定线性判别函数,然后根据这个线性判别函数,对测试数据进行测试,得到测试数据的类别。
Fisher判别分析是要实现有最大的类间距离,以及最小的类内距离
在这里插入图片描述
线性判别函数的一般形式可表示成
g ( X ) = W T X + w 0 g(X)=W^TX+w_{0} g(X)=WTX+w0
其中
在这里插入图片描述
Fisher选择投影方向W的原则,即使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求。

(一)W的确定

各类样本均值向量mi
在这里插入图片描述
样本类内离散度矩阵和总类内离散度矩阵Sw
在这里插入图片描述
样本类间离散度矩阵Sb
在这里插入图片描述
在投影后的一维空间中,各类样本均值
在这里插入图片描述
样本类内离散度和总类内离散度
在这里插入图片描述
样本类间离散度
在这里插入图片描述
Fisher准则函数为max
在这里插入图片描述

(二)阈值的确定

是个常数,称为阈值权,对于两类问题的线性分类器可以采用下属决策规则:
在这里插入图片描述
如果g(x)>0,则决策x属于W1;如果g(x)<0,则决策x属于W2;如果g(x)=0,则可将x任意分到某一类,或拒绝。

(三)Fisher线性判别的决策规则

1.投影后,各类样本内部尽可能密集,即总类内离散度越小越好。
2.投影后,各类样本尽可能离得远,即样本类间离散度越大越好。
根据这两个性质,可求出
在这里插入图片描述
这就是Fisher判别准则下的最优投影方向。最后得到决策规则,如果
在这里插入图片描述

在这里插入图片描述
对于某一个未知类别的样本向量x,如果y=WT·x>y0,则x∈w1;否则x∈w2。

(四)“群内离散度”与“群间离散度”

“群内离散度”要求的是距离越远越好;而“群间离散度”的距离越近越好
由上可知:“群内离散度”(样本类内离散矩阵)的计算公式为
在这里插入图片描述

因为每一个样本有多维数据,因此需要将每一维数据代入公式计算后最后在求和即可得到样本类内离散矩阵。存在多个样本,重复该计算公式即可算出每一个样本的类内离散矩阵
“群间离散度”(总体类离散度矩阵)的计算公式为
在这里插入图片描述

例如鸢尾花数据集,会将其分为三个样本,因此就会得到三个总体类离散度矩阵,三个总体类离散度矩阵根据上述公式计算即可。

二、python实现

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 
import seaborn as sns
path=r'media/Iris.csv'
df = pd.read_csv(path, header=0)
Iris1=df.val
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Fisher线性判别Python代码实现: ```python # 引入必要的库 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris # 加载鸢尾花数据集 iris = load_iris() X = iris.data y = iris.target # Fisher线性判别函数 def fisher(X, y): # 计算每个类别的均值向量 mean_vectors = [] for cl in range(0, 3): mean_vectors.append(np.mean(X[y==cl], axis=0)) # 计算类内散度矩阵 S_W = np.zeros((4,4)) for cl,mv in zip(range(0,3), mean_vectors): class_sc_mat = np.zeros((4,4)) # scatter matrix for every class for row in X[y == cl]: row, mv = row.reshape(4,1), mv.reshape(4,1) # make column vectors class_sc_mat += (row-mv).dot((row-mv).T) S_W += class_sc_mat # sum class scatter matrices # 计算类间散度矩阵 overall_mean = np.mean(X, axis=0) S_B = np.zeros((4,4)) for i,mean_vec in enumerate(mean_vectors): n = X[y==i,:].shape[0] mean_vec = mean_vec.reshape(4,1) # make column vector overall_mean = overall_mean.reshape(4,1) # make column vector S_B += n * (mean_vec - overall_mean).dot((mean_vec - overall_mean).T) # 计算特征值和特征向量 eig_vals, eig_vecs = np.linalg.eig(np.linalg.inv(S_W).dot(S_B)) # 将特征向量按照特征值大小进行排序 eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))] eig_pairs = sorted(eig_pairs, key=lambda k: k[0], reverse=True) # 选择前两个特征向量组成变换矩阵 W = np.hstack((eig_pairs[0][1].reshape(4,1), eig_pairs[1][1].reshape(4,1))) # 返回变换矩阵 return W # 将数据投影到二维平面上 def plot(X, y, W): X_lda = X.dot(W) ax = plt.subplot(111) for label,marker,color in zip( range(0,3),('^', 's', 'o'),('blue', 'red', 'green')): plt.scatter(x=X_lda[:,0][y == label], y=X_lda[:,1][y == label], marker=marker, color=color, alpha=0.5, label=label_dict[label]) plt.xlabel('LD1') plt.ylabel('LD2') plt.legend(loc='upper right') plt.title('LDA: Iris projection onto the first 2 linear discriminants') plt.show() # 运行Fisher线性判别函数并绘制结果 W = fisher(X, y) plot(X, y, W) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值