首页 > 其他分享 >[神经网络与深度学习笔记]LDA降维

[神经网络与深度学习笔记]LDA降维

时间:2024-09-21 14:50:41浏览次数:1  
标签:LDA plt lda label 降维 神经网络 eig print mean

LDA降维

LinearDiscriminant Analysis 线性判别分析,是一种有监督的线性降维算法。与PCA保持数据信息不同,LDA的目标是将原始数据投影到低维空间,尽量使同一类的数据聚集,不同类的数据尽可能分散

步骤:

  • 计算类内散度矩阵\(S_b\)
  • 计算类间散度矩阵\(S_w\)
  • 计算矩阵\(S_w^{-1}S_b\)
  • 对矩阵\(S_w^{-1}S_b\)进行特征分解,计算最大的\(d\)个最大的特征值对应的特征向量组成\(W\)
  • 计算投影后的数据点\(Y = W^TX\)

其中的内散度矩阵\(S_b\)、类间散度矩阵\(S_w\),概念复杂,是一种距离度量方法,我们通过计算机帮助计算即可。

image-20240918180753464

导入iris数据

import numpy as np
import pandas as pd
df=pd.read_csv(r'iris.data')
print(df.shape)

#查看类别
print(set(df['Iris-setosa']))
df.columns=['sepal length','sepal width',
            'petal length','petal width','class label']
df.head(6)

image-20240921144034224

转换标签数据,然后将四维数据特征进行降维

from sklearn.preprocessing import LabelEncoder

X=df[['sepal length','sepal width',
      'petal length','petal width']].values
y=df['class label'].values

#映射标签(使用sklearn包快速完成标签转换)
enc=LabelEncoder()
y=enc.fit_transform(y)+1

print(set(y))

image-20240921144216227

import numpy as np
np.set_printoptions(precision=4)

#保存均值
mean_vectors=[]
#计算类别
for cl in range(1,4):
    mean_vectors.append(np.mean(X[y==cl],axis=0))
    print('均值类别%s:%s\n' % (cl,mean_vectors[cl-1]))

image-20240921144257583

不使用sklearn

计算类内散步矩阵

\(S_W=\sum_{i=1}^cS_i\)

\(S_i=\sum_{z\in D_i}^n\left(x-m_i\right)\left(x-m_i\right)^\mathrm{T}\)

\(m_i=\frac{1}{n_i}\sum_{x\in D_i}^nx_k\)

s_w=np.zeros((4,4))  #4个特征
for cl,mv in zip(range(1,4),mean_vectors):
    class_sc_mat=np.zeros((4,4))
    for row in X[y==cl]:
        #对每个特征进行计算
        row,mv=row.reshape(4,1),mv.reshape(4,1)
        #上面的计算公式
        class_sc_mat+=(row-mv).dot((row-mv).T)
    s_w+=class_sc_mat
print('类内散布矩阵:\n',s_w)

image-20240921144340253

计算类间散步矩阵

$S_B=\sum_{i=1}cN_i(m_i-m)(m_i-m)\top $

#全局均值
overall_mean=np.mean(X,axis=0)
overall_mean

image-20240921144616461

#类间散布矩阵
s_b=np.zeros((4,4))

#对各类别分别计算
for i,mean_vec in enumerate(mean_vectors):
    #当前类别样本数
    n=X[y==i+1,:].shape[0]
    mean_vec=mean_vec.reshape(4,1)
    overall_mean=overall_mean.reshape(4,1)
    
    #上述公式
    s_b+=n*(mean_vec-overall_mean).dot((mean_vec-overall_mean).T)
print('类间散布矩阵:\n',s_b)

image-20240921144632557

#求解特征值、特征向量
eig_vals,eig_vecs=np.linalg.eig(np.linalg.inv(s_w).dot(s_b)) #s_w求解逆矩阵

for i in range(len(eig_vals)):
    eigvec_sc=eig_vecs[:,i].reshape(4,1)
    print('\n特征向量{}:\n{}'.format(i+1,eigvec_sc.real))
    print('特征值{:}: {:.2e}'.format(i+1,eig_vals[i].real))

特征向量1:
[[-0.2051]
[-0.3869]
[ 0.5463]
[ 0.714 ]]
特征值1: 3.19e+01

特征向量2:
[[-0.0084]
[-0.5891]
[ 0.2545]
[-0.7669]]
特征值2: 2.77e-01

特征向量3:
[[ 0.8205]
[-0.144 ]
[-0.0962]
[-0.5448]]
特征值3: -3.90e-15

特征向量4:
[[-0.5111]
[ 0.4445]
[ 0.4866]
[-0.5517]]
特征值4: -6.27e-16

得到4个特征向量和其对应的特征值。

特征值越大,所对应的特征向量越重要,所以接下来可进行排序。

#特征值和特征向量配对
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)
print('特征排序结果:\n')
for i in eig_pairs:
    print(i[0])

image-20240921144826436

print('特征值占总体百分比:\n')
eigv_sum=sum(eig_vals)
for i,j in enumerate(eig_pairs):
    print('特征值[0:]: {1:.2%}'.format(i+1,(j[0]/eigv_sum).real))

image-20240921144844108

W=np.hstack((eig_pairs[0][1].reshape(4,1),
            eig_pairs[1][1].reshape(4,1)))
print('矩阵W:\n',W.real)

image-20240921144914213

#执行降维
X_lda=X.dot(W)
print(X_lda.shape)
pd.DataFrame(X_lda).head(6)

image-20240921144932132

import matplotlib.pyplot as plt

def plot_lda():
    ax=plt.subplot(111)
    for label,marker,color in zip(
    range(1,4),('^','s','o'),('blue','red','green')):
        plt.scatter(x=X[:,0].real[y==label],
                   y=X[:,1].real[y==label],
                   marker=marker,
                   color=color,
                   alpha=0.5,
                   label=y[label])
    plt.xlabel('X[0]')
    plt.ylabel('X[1]')
    #plt.legend()

plot_lda()

源数据挑两个维度作图:

image-20240921145015699

降维后用数据作图:

def plot_lda():
    ax=plt.subplot(111)
    for label,marker,color in zip(
    range(1,4),('^','s','o'),('blue','red','green')):
        plt.scatter(x=X_lda[:,0].real[y==label],
                   y=X_lda[:,1].real[y==label],
                   marker=marker,
                   color=color,
                   alpha=0.5,
                   label=y[label])
    plt.xlabel('X[0]')
    plt.ylabel('X[1]')
    #plt.legend()

plot_lda()

image-20240921145040871

如果对原始数据集随机取两维数据,数据集并不能按类别划分开,但降维后的数据点,区分的较为明显

使用sklearn版本

#使用sklearn版本
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

sklearn_LDA=LDA(n_components=2)
X_lda_sklearn=sklearn_LDA.fit_transform(X,y)

pd.DataFrame(X_lda_sklearn).head(6)

image-20240921145116473

def plot_lda():
    ax=plt.subplot(111)
    for label,marker,color in zip(
    range(1,4),('^','s','o'),('blue','red','green')):
        plt.scatter(x=X_lda_sklearn[:,0].real[y==label],
                   y=X_lda_sklearn[:,1].real[y==label],
                   marker=marker,
                   color=color,
                   alpha=0.5,
                   label=y[label])
    plt.xlabel('X[0]')
    plt.ylabel('X[1]')
    #plt.legend()
  
plot_lda()

image-20240921145128545

标签:LDA,plt,lda,label,降维,神经网络,eig,print,mean
From: https://www.cnblogs.com/jinwan/p/18424012

相关文章

  • 【语义分割】语义分割中的语义指的是什么?卷积神经网络中的特征指的是什么?什么是高级特
    【语义分割】语义分割中的语义指的是什么?卷积神经网络中的特征指的是什么?什么是高级特征?什么是低级特征?【语义分割】语义分割中的语义指的是什么?卷积神经网络中的特征指的是什么?什么是高级特征?什么是低级特征?文章目录【语义分割】语义分割中的语义指的是什么?卷积神经......
  • 【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状
    【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??文章目录【深度学习|可视化】如何以图形化的方式展示神经......
  • 回归预测|2024年最新优化算法美洲狮优化器PO 基于美洲狮PO优化BP神经网络数据时间序列
    回归预测|2024年最新优化算法美洲狮优化器PO基于美洲狮PO优化BP神经网络数据时间序列算法完整Maltab程序有对比文章目录一、基本原理1.美洲狮优化算法(POA)简介2.BP神经网络(BPNeuralNetwork)简介3.PO-BP回归预测流程总结二、实验结果三、核心代码四、代码获取五......
  • Java中的图神经网络:如何在大规模图数据中实现嵌入学习
    Java中的图神经网络:如何在大规模图数据中实现嵌入学习大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!近年来,图神经网络(GraphNeuralNetworks,GNN)在处理图结构数据上取得了显著进展,尤其是在社交网络、推荐系统、知识图谱等领域。与传统的神经网络......
  • 多输入多输出 | Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测
    多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测目录多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料预测效果基本介绍多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入......
  • 时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测
    时序预测|Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测目录时序预测|Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测预测效果基本介绍程序设计参考资料预测效果基本介绍Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测(完整源码和数据)1.data为数据集,单......
  • CNN-SVM模型 | Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分
    CNN-SVM模型|Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分类预测目录CNN-SVM模型|Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料分类效果基本描述1.Matlab实现SO-CNN-SVM蛇群算法优化......
  • centos7LDAP服务搭建
    ladp服务搭建用户名:cn=admin,dc=test,dc=com密码:1234561)软件安装yuminstallopenldapopenldap-clientsopenldap-servers-y2)配置OpenLDAPServervim/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif将cn=Manager,dc=my-domain,dc=com改为你自己的,内容可以随......
  • 图神经网络模型的应用(8)--1
    1.图数据上的一般任务        前面介绍过,按照元素和层级来划分,图数据上的任务一般可以分为节点上的任务、边上的任务和图上的任务。而在实际应用中,大部分图神经网络的应用都集中在节点分类、链路预测和图分类上;在设计一个新的图神经网络模型时,我们常使用的标准数据集......
  • BayesianLSTM PawaritL 使用PyTorch中的贝叶斯LSTM进行能源消耗预测,贝叶斯神经网络仅
    https://colab.research.google.com/github/PawaritL/BayesianLSTM/blob/master/Energy_Consumption_Predictions_with_Bayesian_LSTMs_in_PyTorch.ipynb#EnergyConsumptionPredictionswithBayesianLSTMsinPyTorchAuthor:PawaritLaosunthara内容:请点击上面的在Col......