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

news/2024/11/13 16:54:01/文章来源:https://www.cnblogs.com/jinwan/p/18424012

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 LabelEncoderX=df[['sepal length','sepal width','petal length','petal width']].values
y=df['class label'].values#映射标签(使用sklearn包快速完成标签转换)
enc=LabelEncoder()
y=enc.fit_transform(y)+1print(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 pltdef 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 LDAsklearn_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/801012.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 指针和迭代器支持的操作

▲ 《C++ Primer》 P96 指针也都支持上面的操作。

代码整洁之道--读书笔记(14)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

hexo安装后报错hexo 不是内部或外部命令,也不是可运行的程序 或批处理文件。

hexo问题 之前利用hexo和gitee搭建了一个博客,但是最近gitee的gitpage停止服务了,便想着在github上搭建一个。 在到安装hexo这一步的时候,一直报错hexo 不是内部或外部命令,也不是可运行的程序 或批处理文件。 我的所有安装步骤和环境变量发现都没有错,反复配置后去找了一…

跑冒滴漏监测系统

跑冒滴漏监测系统应用计算机视觉和深度学习技术对危化品生产区域实时检测,当检测到液体泄露时,立即抓拍存档告警并回传给后台监控平台方便人员及时处理,提高图像数据的实时监控效率。跑冒滴漏监测系统7*24小时不间断对监控画面实时分析监测,避免意外事故发生,同时降低人力…

学校食堂明厨亮灶监控系统

学校食堂明厨亮灶监控系统通过卷积神经网络学习与图像识别技术,学校食堂明厨亮灶监控系统将对现场监控画面进行24小时实时分析,如:厨房出现老鼠狗猫、厨师未戴口罩、厨师未戴厨师帽、厨师服穿戴识别、抽烟识别、玩手机识别,同时实时抓拍相关情况,全程记录留痕,提升监管效…

河道采砂识别监测系统

河道采砂识别监测系统借助深度视觉边缘分析技术,自动对监控区域违法采砂进行实时监测。如果河道采砂识别监测系统监测到有人违法采砂时,立即抓拍存档预警,将违规采砂截图发给后台管理中心,提醒后台人员及时处理。河道采砂识别监测系统可根据时间段违规记录、视频进行查找,…

煤炭传送带状态检测系统

煤炭传送带状态检测系统通过机器视觉+边缘分析技术对煤炭皮带状况进行实时监测,一旦煤炭传送带状态检测系统监测到皮带跑偏、堆煤、撕裂、异物等其他情况,煤炭传送带状态检测系统马上开展警报提醒,通知后台监控平台,并提醒相关人员及时处置。煤炭传送带状态检测系统同时把告…

城市道路积水识别监测系统

城市道路积水识别监测系统基于机器视觉分析,城市道路积水识别监测系统实时识别街道路面积水情况,对严重积水时立即报警。城市道路积水识别监测系统对低洼区域进行实时监测,一旦城市道路积水识别监测系统监测到街道路面积水时,立即进行抓拍告警,告知监控管理中心,提醒相关…

Thinkphp8安装topthink/think-captcha验证码的和使用方法

ThinkPHP8默认没有验证码,安装验证码可以使用composer来安装验证码 一、安装验证码 执行composer安装验证码 composer require topthink/think-captcha二、使用方法 1、在目录app\middleware.php中开启session \think\middleware\SessionInit::class 2、配置验证码 安装好验证…

水尺监测识别系统

水尺监测识别系统利用计算机视觉+机器学习技术对河道湖泊进行实时检测,当水尺监测识别系统监测到河道水位异常时,立即告警。水尺监测识别系统同时将告警截图和视频保存下来,推送给后台。水尺监测识别系统极大提升现场区域的管控效率,既方便又节省人力。水尺监测识别系统利用…

人员规范操作行为识别系统

人员规范操作行为识别系统对现场人员操作行为进行实时监测分析,如果人员规范操作行为识别系统发现现场人员未按照要求规范进行操作、遗漏操作步骤更改先后作业顺序或者操作不规范,人员规范操作行为识别系统立即抓拍存档现场语音播报提醒相关人员行为不规范请立即改正,并同步…

皮带跑偏检测系统

皮带跑偏检测系统对煤矿皮带运行状态进行全天候实时监测,一旦皮带跑偏检测系统监测到现场皮带跑偏、撕裂、堆煤、异物等异常情况时,皮带跑偏检测系统马上开展警报,通知监督管理办公室,并提醒负责人及时处置。皮带跑偏检测系统并把警报截屏和视频储存到数据库系统系统中生成…