首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy中KNN的主成分分析

numpy中KNN的主成分分析
EN

Stack Overflow用户
提问于 2020-03-30 08:56:29
回答 1查看 174关注 0票数 1

我的任务是实现我的PCA代码,将数据转换为2d字段,以便进行KNN分配。我的PCA代码创建了一个包含被称为PCevecs的特征向量的数组。

代码语言:javascript
复制
def __PCA(data):
   #Normalize data
   data_cent = data-np.mean(data)

   #calculate covariance
   covarianceMatrix = np.cov(data_cent, bias=True)

   #Find eigenvector and eigenvalue
   eigenvalue, eigenvector= np.linalg.eigh(covarianceMatrix)

   #Sorting the eigenvectors and eigenvalues:
   PCevals = eigenvalue[::-1]
   PCevecs = eigenvector[:,::-1]

   return PCevals, PCevecs

该分配使用PCA转换训练数据。返回的PCevecs具有调用print(PCevecs.shape)给出的形状(88,88)。训练数据的形状为(88,4)。

代码语言:javascript
复制
np.dot(trainingFeatures, PCevecs[:, 0:2])

当代码运行时,我得到一个错误消息:"ValueError: shapes ( 88 ,4)和(88,2)不合并:4 (dim 1) != 88 (dim 0)“。我可以看到数组不匹配,但我看不出我对PCA实现做了什么错误。我试着看看Stackoverflow上的类似问题。我没见过有人用同样的方式对特征向量和特征值进行排序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 09:29:54

(编辑了并提供了注释中的其他信息)

虽然PCA实现在一般情况下是可以的,但您可能希望在转换的数据上计算它,或者您希望确保通过np.cov()参数告诉rowvar您的维度在哪个轴。

以下内容将如您所期望的那样起作用:

代码语言:javascript
复制
import numpy as np


def __PCA_fixed(data, rowvar=False):
   # Normalize data
   data_cent = data - np.mean(data)

   # calculate covariance (pass `rowvar` to `np.cov()`)
   covarianceMatrix = np.cov(data_cent, rowvar=rowvar, bias=True)  
   # Find eigenvector and eigenvalue
   eigenvalue, eigenvector= np.linalg.eigh(covarianceMatrix)

   # Sorting the eigenvectors and eigenvalues:
   PCevals = eigenvalue[::-1]
   PCevecs = eigenvector[:,::-1]

   return PCevals, PCevecs

用一些随机数测试它:

代码语言:javascript
复制
data = np.random.randint(0, 100, (100, 10))
PCevals, PCevecs = __PCA_fixed(data)
print(PCevecs.shape)
# (10, 10)

另外,请注意,在更一般的术语中,奇异值分解 (np.linalg.svd() in NumPy)可能是主成分分析的更好方法(使用使用和转换的与特征值分解的简单关系 )。

作为一般的编码风格说明,遵循佩普-8的建议可能是个好主意,其中许多建议可以通过一些自动化工具(如autopep8 )进行检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60927076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档