首页 > 编程问答 >从sklearn PCA获取特征值和向量

从sklearn PCA获取特征值和向量

时间:2024-07-27 07:52:27浏览次数:16  
标签:python scipy scikit-learn pca

我如何获得 PCA 应用程序的特征值和特征向量?

from sklearn.decomposition import PCA
clf=PCA(0.98,whiten=True)      #converse 98% variance
X_train=clf.fit_transform(X_train)
X_test=clf.transform(X_test)

我在 文档 中找不到它。

1.我“不”能够理解不同的结果在这里。

编辑

def pca_code(data):
    #raw_implementation
    var_per=.98
    data-=np.mean(data, axis=0)
    data/=np.std(data, axis=0)
    cov_mat=np.cov(data, rowvar=False)
    evals, evecs = np.linalg.eigh(cov_mat)
    idx = np.argsort(evals)[::-1]
    evecs = evecs[:,idx]
    evals = evals[idx]
    variance_retained=np.cumsum(evals)/np.sum(evals)
    index=np.argmax(variance_retained>=var_per)
    evecs = evecs[:,:index+1]
    reduced_data=np.dot(evecs.T, data.T).T
    print(evals)
    print("_"*30)
    print(evecs)
    print("_"*30)
    #using scipy package
    clf=PCA(var_per)
    X_train=data.T
    X_train=clf.fit_transform(X_train)
    print(clf.explained_variance_)
    print("_"*30)
    print(clf.components_)
    print("__"*30)
  1. 我希望获得所有特征值和特征向量,而不仅仅是具有收敛条件的约简集。

好的,以下是获取 sklearn.decomposition.PCA 对象中的特征值和特征向量,以及理解不同结果的原因的解释:

1. 获取特征值和特征向量

可以在拟合 PCA 对象后,使用以下属性访问特征值和特征向量:

  • explained_variance_ : 这给出了每个主成分的解释方差。这些值表示每个主成分捕获的数据方差量。它们对应于特征值。
  • components_ : 这提供了主成分。每个主成分的系数按解释方差的降序排列(第一主成分在第一列,依此类推)。这些对应于特征向量。

2. 理解结果的差异

代码中 pca_code 函数和 sklearn 的 PCA 类之间的结果差异可能是由于以下一个或多个因素造成的:

  • 数据标准化: sklearn 的 PCA 类默认情况下不进行标准化。但是,的 pca_code 函数通过以下方式对数据进行标准化: python data -= np.mean(data, axis=0) data /= np.std(data, axis=0) 此标准化步骤会影响计算的协方差矩阵和最终的特征值和特征向量。为了使结果一致,应该在将数据传递给 PCA 类之前对其进行标准化,或者在 pca_code 函数中禁用标准化。

  • 特征向量排序: pca_code 函数和 PCA 类都按解释方差的降序对特征值(和对应的特征向量)进行排序。但是,可能存在由于数值精度或用于计算特征值和特征向量的特定算法而导致的微小差异,这可能会导致顺序略有不同。

  • 特征向量符号: 特征向量定义为相对于原点的方向。因此,特征向量可以按其负值或正值进行缩放,并且仍然代表相同的主成分。 pca_code 函数和 PCA 类可能会为某些特征向量返回不同的符号,但这不会影响结果。

3. 获取所有特征值和特征向量

默认情况下, sklearn 的 PCA 类会返回与指定的方差阈值或组件数相对应的主成分(特征值和特征向量)。

要获得所有特征值和特征向量,无论解释的方差如何,应该在初始化 PCA 对象时将 n_components 参数设置为 None 或大于或等于特征数量的值。 例如:

clf = PCA(n_components=None)  # 或 n_components=data.shape[1]
X_train = clf.fit_transform(X_train)

这将导致 PCA 对象计算所有主成分,并且可以使用 explained_variance_ components_ 属性访问所有特征值和特征向量。

更正后的代码

以下是已更正的代码,用于获取所有特征值和特征向量,以及标准化数据的选项:

import numpy as np
from sklearn.decomposition import PCA

def pca_code(data, standardize=True):
    if standardize:
        data -= np.mean(data, axis=0)
        data /= np.std(data, axis=0)

    cov_mat = np.cov(data, rowvar=False)
    evals, evecs = np.linalg.eigh(cov_mat)
    idx = np.argsort(evals)[::-1]
    evecs = evecs[:, idx]
    evals = evals[idx]

    return evals, evecs

# 示例用法
data = np.random.rand(100, 5)  # 100 个样本,5 个特征

# 使用 pca_code 函数
evals, evecs = pca_code(data)
print("pca_code - 特征值:", evals)
print("pca_code - 特征向量:", evecs)
print("_"*30)

# 使用 sklearn 的 PCA 类
clf = PCA(n_components=None)  # 计算所有主成分
clf.fit(data)
print("PCA - 解释方差(特征值):", clf.explained_variance_)
print("PCA - 成分(特征向量):", clf.components_)

这将打印出使用 pca_code 函数和 sklearn PCA 类计算的所有特征值和特征向量。

标签:python,scipy,scikit-learn,pca
From: 31909945

相关文章

  • Python,pandas从字符串中解析数字和字符串
    在Python中,我想解析一个字符串并将数字部分(可能有也可能没有小数点)作为浮点数返回,并将后缀作为字符串返回。示例为:7.1英寸->7.1,英寸7.1”->7.1,“7英寸->7.0,英寸-10dB->-10.0,dB-10.2dB->-10.2,dB数字部分和后缀之间没有空格。另外,我想将其应......
  • 如何在 Python 中加载站点的所有资源,包括 AJAX 请求等?
    我知道如何使用Python请求网站并读取其文本。过去,我曾尝试使用像BeautifulSoup这样的库来发出对网站上链接的所有请求,但这并没有得到看起来不像完整URL的内容,例如AJAX请求和大多数对原始域(因为“http://example.com”将丢失,更重要的是,它不是<ahref='url'>......
  • 使用Python进行PDF旋转
    使用python旋转扫描的pdf后,它工作得很好,但将pdf发送给第三方后,第三方仍然将pdf检测为90度pdf有什么办法可以解决旋转和这个问题importPyPDF2withopen('input.pdf','rb')asfile:#CreateaPDFreaderobjectreader=PyPDF2.PdfReader(file)......
  • Python win32serviceutil QueryServiceStatus:返回值是什么意思?
    我正在学习使用pywin32,并尝试在64位Python3.6.4上使用win32serviceutil模块以下代码:importwin32serviceutilasserviceserviceStatus=service.QueryServiceStatus("WinDefend")print(serviceStatus)返回以下元组:(16,4,197,0,0,0,0)我对wind......
  • Python request-html 未下载 Chromium
    importrequestsfrombs4importBeautifulSoupfromrequests_htmlimportHTMLSessionurl="https://dmarket.com/ingame-items/item-list/csgo-skins?title=recoil%20case"sesion=HTMLSession()response=sesion.get(url)response.html.render()soup=B......
  • VS Code 不改变 python 环境
    我正在使用VS-Code和anaconda环境作为python解释器。我通过ctrl+shift+`选择准确的anaconda基础环境,它也反映在vscode的下侧面板中。但是,当我检查python版本时,它显示我系统的默认python环境3.7.9如果您看到下面的截图,anaconda环境是3.......
  • 使用 Python 打开保存为 Parquet 文件中元数据的 R data.table
    使用R,我创建了一个Parquet文件,其中包含一个data.table作为主要数据,另一个data.table作为元数据。library(data.table)library(arrow)dt=data.table(x=c(1,2,3),y=c("a","b","c"))dt2=data.table(a=22222,b=45555)attr(dt,&......
  • Python 需要 Windows 长路径
    我尝试运行此安装:pip3installmsgraph-sdk它给了我这个错误:它说我需要使用此链接启用Windows长路径:https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-versi......
  • Python griddata() 和 Matlab griddata():某些网格点的结果不同
    在将一些(相当大的物理)Matlab代码转换为Python时,我偶然发现了这种情况。当对相同的二维离散数据进行插值时,Python/Scipy的griddata()函数给出的结果与Matlab的对应函数不同。griddata()Matlab示例代码:Python示例代码:%Samplepoints(x,y):7x5=3......
  • Ebay Python SDK 仅在特定项目类别上返回错误
    我在一个项目中使用ebaySDK一段时间了。最近我尝试导入一些商品,例如手表、手机壳等...并且我使用了eBay自己通过eBay返回的英国商店页面上的类别ID他们的“get_category_suggestions”API端点,但eBay似乎有选择地决定拒绝某些项目并引发服务器错误!为了测试,我做了......