首页 > 其他分享 >机器学习:对数据进行降维(PCA和SVD)

机器学习:对数据进行降维(PCA和SVD)

时间:2024-09-06 21:54:27浏览次数:6  
标签:SVD 矩阵 降维 train test 0.94 PCA

目录

前言

一、PCA

1.PCA是什么?

2.PCA的实现使用步骤

3.PCA参数解释

4.代码实现

5.PCA的优缺点

二、SVD

1.SVD是什么?

2.SVD的实现步骤

3.代码实现

总结


前言

        数据降维是将高维数据转换为较低维度的过程,同时尽量保留数据中的关键信息。这有助于减少计算复杂性、减轻噪声影响,并可能揭示数据中的潜在模式。常用的降维技术包括主成分分析(PCA)、奇异值分解(SVD)等。

 

一、PCA

1.PCA是什么?

         主成分分析(PCA)是一种降维技术,用于将数据投影到低维空间,同时尽可能保留数据的方差。使用 PCA 可以提高计算效率,减少噪音,并发现数据中的重要模式

 

2.PCA的实现使用步骤

  1. 数据标准化:将数据缩放到均值为0、方差为1的标准范围,以确保不同特征对分析的贡献相同。
  2. 计算协方差矩阵:通过计算特征之间的协方差,来了解特征间的关系。
  3. 求解特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。
  4. 选择主成分:根据特征值的大小选择前几个最大的特征值所对应的特征向量,这些特征向量构成新的特征空间。
  5. 转换数据:将原始数据投影到新的特征空间中,得到降维后的数据。

 

3.PCA参数解释

导入方式

from sklearn.decompsition import PCA

PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0
, iterated_power=’auto’, random_state=None)

主要参数:

n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。简单来说:指定整数,表示要降维到的目标,【比如十维的数据,指定n_components=5,表示将十维数据降维到五维】如果为小数,表示累计方差百分比。0.9

copy : 类型:bool,True或者False,缺省时默认为True。

意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。【按默认为True】

whiten:判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。

主要属性:

components_:array, shape (n_components, n_features) 指表示主成分系数矩阵

explained_variance_降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。

explained_variance_ratio_降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。【一般看比例即可 >90%】

 

4.代码实现

  • 这段代码是对鸢尾花的数据进行降维,然后使用逻辑回归进行分类
'''PCA降维只能捕捉线性关系,不适用于非线性数据'''

import pandas as pd

data = pd.read_excel('hua.xlsx')

x = data.iloc[:, :-1]
y = data.iloc[:, -1]

'''对特征进行降维'''
from sklearn.decomposition import PCA

pca = PCA(n_components=0.9)  # 设置n_components=0.9表示保留足够的主成分  以解释至少90%的数据方差

pca.fit(x)  # 使用数据 x 训练PCA模型,计算数据的主成分。

print(f"特征所占百分比:{sum(pca.explained_variance_ratio_)}")
print(pca.explained_variance_ratio_)
print(pca.explained_variance_)

new_x = pca.transform(x)  # 将原始数据 x 投影到选定的主成分上 new_x = pca.fit_transform(x) 可以省去pca.fit(x)
print(new_x)

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = \
    train_test_split(new_x, y, test_size=0.2, random_state=0)

from sklearn.linear_model import LogisticRegression

lg = LogisticRegression(C=2)
lg.fit(x_train, y_train)

from sklearn import metrics

train_pre = lg.predict(x_train)
print(metrics.classification_report(y_train, train_pre))

test_pre = lg.predict(x_test)
print(metrics.classification_report(y_test, test_pre))


'''不进行降维'''
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = \
    train_test_split(x, y, test_size=0.2, random_state=0)

from sklearn.linear_model import LogisticRegression

lg = LogisticRegression()
lg.fit(x_train, y_train)

from sklearn import metrics

train_pre = lg.predict(x_train)
print(metrics.classification_report(y_train, train_pre))

test_pre = lg.predict(x_test)
print(metrics.classification_report(y_test, test_pre))

输出:

  • 上面一个混淆矩阵是降维之后的
  • 下面一个混淆矩阵是降维之前的
  • 说明进行降维不一定能提高模型的正确率
特征所占百分比:0.9287327483408421
[0.84389796 0.08483479]   # 主成分特征所占百分比
[1.2415529  0.12480997]   # 主成分特征的方差
              precision    recall  f1-score   support

           0       0.92      0.96      0.94        25
           1       0.96      0.93      0.94        27

    accuracy                           0.94        52
   macro avg       0.94      0.94      0.94        52
weighted avg       0.94      0.94      0.94        52

              precision    recall  f1-score   support

           0       0.96      0.92      0.94        25
           1       0.93      0.96      0.95        27

    accuracy                           0.94        52
   macro avg       0.94      0.94      0.94        52
weighted avg       0.94      0.94      0.94        52

 

5.PCA的优缺点

  • 优点:
    • 1.计算方法简单,容易实现。
    • 2.可以减少指标筛选的工作量。
    • 3.消除变量间的多重共线性。
    • 4.在一定程度上能减少噪声数据。
  • 缺点:
    • 1.特征必须是连续型变量。
    • 2.无法解释降维后的数据是什么。
    • 3.贡献率小的成分有可能更重要。

 

二、SVD

1.SVD是什么?

奇异值分解(SVD)是一种矩阵分解技术,用于将任意矩阵 A 分解为三个矩阵的乘积:                                                        A=UΣVT

其中:

  • U 是一个正交矩阵,包含了 A 的左奇异向量。
  • Σ 是一个对角矩阵,包含了奇异值。
  • VT 是 A 的右奇异向量的转置。

 

2.SVD的实现步骤

  1. 计算协方差矩阵(如果适用):对于数据矩阵,计算其协方差矩阵。
  2. 进行 SVD 分解:将矩阵 A 分解为 U, Σ, 和 VT,即 A=UΣVT。
  3. 提取奇异值:从 Σ 中提取奇异值,按降序排列。
  4. 选择主成分(如需要):选择前几个最大的奇异值对应的列,从 U 和 VT 中提取相应的向量。
  5. 构建低秩近似(如需要):使用选定的奇异值和对应的向量构建矩阵的低秩近似。

 

3.代码实现
 

  • 因为SVD是对矩阵进行降维,所以先把图片转换成矩阵格式,即数组
  • 然后对其进行奇异值分解,得到u,sig和vt三个矩阵
  • 然后选取u矩阵前k行,sig的对角矩阵和vt矩阵前k列组合压缩之后的图片
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image


def pic_compress(k, pic_array):
    global u, sigma, vt, sig, new_pic

    u, sigma, vt = np.linalg.svd(pic_array)  # 进行奇异值分解
    sig = np.eye(k) * sigma[:k]
    new_pic = np.dot(np.dot(u[:, :k], sig), vt[:k, :])
    size = u.shape[0] * k + sig.shape[0] * sig.shape[1] + k * vt.shape[1]
    return new_pic, size


img = Image.open('a.jpg')
ori_img = np.array(img)
new_img, size = pic_compress(100, ori_img)  # 压缩的维度
print('original size:' + str(ori_img.shape[0] * ori_img.shape[1]))
print('original size:' + str(size))
fig, ax = plt.subplots(1, 2)
ax[0].imshow(ori_img, cmap='gray')
ax[0].set_title('before compress')
ax[1].imshow(new_img, cmap='gray')
ax[1].set_title('after compress')
plt.show()

输出:

第一行是原图所占空间大小,第二行是压缩之后所占空间大小

original size:1365760
compress size:244700

 

总结

        数据降维不一定能提高模型的正确率,但是可以帮助我们更快速地处理数据

标签:SVD,矩阵,降维,train,test,0.94,PCA
From: https://blog.csdn.net/weixin_65047977/article/details/141968244

相关文章

  • 使用SVD(奇异值分解)进行降维的奇妙之旅
    在数据分析和机器学习的广阔天地中,降维技术占据着举足轻重的地位。当我们面对高维数据时,不仅计算成本高昂,而且容易遭遇“维度灾难”,即随着维度的增加,数据的稀疏性和距离度量失效等问题愈发严重。为了克服这些挑战,各种降维技术应运而生,其中奇异值分解(SingularValueDecompositi......
  • 《机器学习》—— PCA降维
    文章目录一、PCA降维简单介绍二、python中实现PCA降维函数的介绍三、代码实现四、PCA降维的优缺点一、PCA降维简单介绍PCA(主成分分析,PrincipalComponentAnalysis)是一种常用的数据降维技术。它通过线性变换将原始数据转换到新的坐标系统中,使得任何投影的第一大方差......
  • 主成分分析-PCA
    文章目录一、简介1.意义2.PCA的应用3.PCA参数解释二、代码实现1.数据预处理2.主成分分析(PCA)3.数据划分4.模型训练与评估5.全部代码三、总结1.PCA的优点2.PCA的缺点一、简介1.意义PCA(主成分分析,PrincipalComponentAnalysis)是一种常用的数据降维技术。它的主......
  • 分享4款安全与认证IC:DS28E30P、MAXQ1065GTC、RNG90-MAVDA-T、RNG90-SSVDA-T(介绍)
    1、DS28E30P安全认证器提供了一种基于FIPS-186ECDSA标准的完整认证解决方案,不仅高度安全,而且易于部署。该安全认证器采用ECDSA挑战和响应认证方式,同时利用安全EEPROM来存储密钥和用户数据。该器件提供了一套核心加密工具,这些加密工具由多种集成块衍生而来,包括一个非对称硬件引擎、......
  • 【自学笔记】处理类别数据、独热编码和降维(主成分分析)
    类别数据  与数值特征不同,类别数据往往更难被计算机理解,主要分为序数和标称。  序数具有顺序,比如衣服尺码中有XL>L>M等  标称不含任何顺序,特征之间相互独立。处理序数特征  为了让算法正确解读序数特征,我们需要用整数来表示。我们可以定义映射关系,训练后再反向......
  • 【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)
     ......
  • EEMD-MPE-KPCA-BiLSTM、EEMD-MPE-BiLSTM、EEMD-PE-BiLSTM故障识别、诊断(Matlab)
    EEMD-MPE-KPCA-BiLSTM(集合经验分解-多尺度排列熵-核主元分析-双向长短期网络)故障识别、诊断(Matlab)目录EEMD-MPE-KPCA-BiLSTM(集合经验分解-多尺度排列熵-核主元分析-双向长短期网络)故障识别、诊断(Matlab)效果一览基本介绍程序设计参考资料效果一览基本介绍EEMD-MPE-KPCA-BiLS......
  • 主成分分析PCA找寻数据“灵魂”-线性代数(4)
    前言-PREFACE面向业务目标从浩瀚的数据中挖掘出相关性最高的数据“灵魂”,简化数据处理,去除噪声,提高计算效率,是人工智能领域的主要课题。除了上篇文章提到的矩阵分解(矩阵分解找寻数据“灵魂”-线性代数(3))之外,主成分分析(PCA,principalcomponentsanalysis,也可以翻译为主成因分析)......
  • python使用 pcap 库捕获网络数据包,附示例
    以下为您提供使用Python的pcap库捕获网络数据包的示例及相关信息:在Python中,可以使用pcap库来实现网络数据包的捕获。例如:importpcap#创建pcap实例pc=pcap.pcap()#设置过滤条件,例如捕获TCP端口为80的数据包pc.setfilter('tcpport80')#开始抓......
  • Python实现等距映射(ISOMAP)降维算法
    目录Python实现等距映射(ISOMAP)降维算法的博客引言ISOMAP算法原理ISOMAP的优势与局限Python实现ISOMAP算法1.创建ISOMAP类2.在瑞士卷数据集上应用ISOMAP3.结果分析总结运行结果Python实现等距映射(ISOMAP)降维算法的博客引言在高维数据处理中,降维是一种常用的技......