【问题标题】:PCA for KNN in numpynumpy 中 KNN 的 PCA
【发布时间】:2020-03-30 08:56:29
【问题描述】:

我的任务是实现我的 PCA 代码,以将数据转换为二维字段以进行 KNN 分配。我的 PCA 代码使用称为 PCevecs 的特征向量创建了一个数组。

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)。

np.dot(trainingFeatures, PCevecs[:, 0:2])

当代码运行时,我收到错误消息“ValueError:形状 (88,4) 和 (88,2) 未对齐:4 (dim 1) != 88 (dim 0)”。我可以看到数组不匹配,但我看不出我在 PCA 实现上做错了什么。我试图在 Stackoverflow 上查看类似的问题。我还没有看到任何人以相同的方式对特征向量和特征值进行排序。

【问题讨论】:

  • 您想通过np.dot() 操作实现什么目标?

标签: python arrays numpy pca


【解决方案1】:

已编辑以及来自 cmets 的其他信息)

虽然 PCA 实现通常没问题,但您可能希望在转置的数据上计算它,或者您希望确保通过 rowvar 参数告诉 np.cov() 您的维度在哪个轴上。

以下将按您的预期工作:

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

用一些随机数对其进行测试:

data = np.random.randint(0, 100, (100, 10))
PCevals, PCevecs = __PCA_fixed(data)
print(PCevecs.shape)
# (10, 10)

另请注意,在更一般的术语中,singular value decomposition(NumPy 中的np.linalg.svd())可能是principal component analysis(使用simple relationship with the eigenvalue decomposition 并转置)的更好方法。


作为一般的编码风格说明,遵循PEP-8 的建议可能是个好主意,其中许多可以通过一些自动化工具轻松检查,例如autopep8.

【讨论】:

  • np.dot(trainingFeatures, PCevecs[:,0:2] 在作业中给出。如果我必须更改部分主干会很奇怪。我想计算特征向量并取点积,您会将数据投影到在这种情况下将是二维字段。您能否详细说明数组的切片?
  • 如果我稍微指定分配文本可能会有所帮助。它说“使用 PCA 通过仅保留 2 个最具代表性的特征向量将数据从 4D 转换为 2D”该数据集是一个鸢尾花数据库。虹膜有 3 种类型,每种类型都有 4 个属性。
猜你喜欢
  • 2012-04-28
  • 2019-09-12
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2021-04-25
  • 2019-03-05
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多