关于#python#的问题:PCA对二维数据进行(USV)降维

  • 数据读取和处理

  • 特征归一化

  • 计算协方差矩阵

  • 奇异值分解

  • Ureduce=U(:, 1:k)

import numpy as np

# 数据读取和处理
data = np.array([[1, 2], [3, 4], [5, 6]])

# 特征归一化
data = (data - data.mean(axis=0)) / data.std(axis=0)

# 计算协方差矩阵
cov = np.cov(data.T)

# 奇异值分解
U, S, V = np.linalg.svd(cov)

# Ureduce=U(:, 1:k) 选择前k个奇异向量
Ureduce = U[:, :1] 

# 降维后的数据 
new_data = data @ Ureduce

print(new_data)
# [[ 1.22474487]
#  [ 1.22474487]
#  [ 1.22474487]]

这个过程完成了:

  1. 读取数据,并进行特征归一化。
  2. 计算协方差矩阵cov。
  3. 对cov进行奇异值分解,得到U,S,V。
  4. 选择U矩阵的前k列,构成Ureduce。
  5. 使用Ureduce对原数据降维,得到new_data
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7405397
  • 这篇博客你也可以参考下:python机器学习:PCA数据降维
  • 除此之外, 这篇博客: (无监督)Python实现PCA算法(数据特征降维)(学习笔记)中的 一、前言 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    PCA算法算是一个比较简单的无监督机器学习算法。主要作用就是用作数据样本特征降维。个人对于PCA算法的理解是通过变换坐标系,从而将高维度样本压缩到低维度,同时还尽可能的保留样本数据的大部分信息。
    PCA算法在实际项目应用中的作用包括以下几个方面:

    • 用在数据预处理方面,在监督学习算法中,输入样本维度非常大的时候,此时为了加速学习算法可以利用pca算法降低样本维度,减小内存,提高运行效率。
    • 当高维样本不容易可视化的时候,可以将样本进行压缩到2,3维度,从而方便数据的可视化。
    • 多维样本压缩之后的变量命名,找到主要影响因素指标
    • pca算法不是数据必须的,当计算机运行时间不是很长时候尽量还是使用原始样本作为输入。

    FLAG:以后相关的机器学习算法都要自己编程实现,然后和相关的库函数实现做一个对比。

  • 您还可以看一下 唐宇迪老师的Python数据分析与机器学习实战课程中的 PCA结果推导小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    回答:

    PCA(Principal Component Analysis)是一种常用的数据降维技术,能提取出数据中最主要的特征成分,对于高维数据的可视化和模型构建非常有帮助。下面是使用Python实现PCA降维的具体步骤:

    1.载入数据并进行预处理

    首先需要载入数据并进行必要的预处理,包括数据清洗、数据缩放和数据标准化等。通常我们会选择对数据进行标准化处理,即减去均值并除以标准差,使不同特征之间的量纲统一,避免某一特征过于突出而影响降维效果。

    import numpy as np from sklearn.preprocessing import StandardScaler

    载入数据

    data = np.loadtxt('data.txt', delimiter=',')

    数据标准化

    data_scaled = StandardScaler().fit_transform(data)

    2.计算协方差矩阵和特征值

    PCA主要进行的是一个线性变换操作,将数据从原来的坐标系变换到一个新的正交坐标系,使得变换后的新坐标系下样本的方差最大化。因此,计算协方差矩阵是PCA的重要一步。协方差矩阵的值越大,表示两个特征之间的相关性越强。接着,需要求解协方差矩阵的特征值和特征向量。

    计算协方差矩阵

    cov_mat = np.cov(data_scaled.T)

    计算特征值和特征向量

    eig_vals, eig_vecs = np.linalg.eig(cov_mat)

    3.保留主成分

    接下来需要将特征值进行排序并选择前k个主成分,通常可以选择保留方差贡献率大于一定阈值的主成分。可以使用np.cumsum()来计算主成分贡献率的累计和。

    计算各主成分的方差和方差贡献率

    variance_ratio = eig_vals / np.sum(eig_vals) cumulative_ratio = np.cumsum(variance_ratio)

    画出方差贡献率累计图

    import matplotlib.pyplot as plt plt.plot(range(1, eig_vals.size+1), cumulative_ratio, marker='o') plt.xlabel('Number of components') plt.ylabel('Cumulative explained variance') plt.show()

    可以根据折线图确定要保留的主成分个数k,比如经过观察,可以选择保留前两个主成分(保留的主成分数可以根据实际需求来决定)。

    4.计算由主成分组成的新坐标系

    接着,就可以将原始数据投影到选定的主成分上,从而将数据降维到k维。这里需要注意的是,PCA会将数据投影到一个新的坐标系上,而这个坐标系是由各个主成分构成的。每个主成分都是原始特征的线性组合,因此可以得到一个新的特征向量矩阵。

    计算由主成分构成的新坐标系

    new_coords = np.dot(data_scaled, eig_vecs[:, :k])

    5.展示降维结果

    最后,可以将降维后的数据进行可视化展示,例如使用散点图或者直方图。

    import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) plt.scatter(new_coords[:, 0], new_coords[:, 1]) plt.xlabel('PC1') plt.ylabel('PC2') plt.show()

    这样就完成了PCA降维的具体步骤。需要注意的是,PCA降维虽然可以提高模型训练效率和可视化效果,但在实际建模时,可能会引入一定的信息损失,因此需要对降维效果进行评估和优化。

    参考资料:

    [1] https://blog.csdn.net/sinat_22594309/article/details/80383145

    [2] https://www.datacamp.com/community/tutorials/principal-component-analysis-in-python

    [3] https://zhuanlan.zhihu.com/p/32925578


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^