【发布时间】:2022-01-12 17:30:30
【问题描述】:
import numpy as np
from numpy import sin, cos, pi
from matplotlib.pyplot import *
rng = np.random.default_rng(42)
N = 200
center = 10, 15
sigmas = 10, 2
theta = 20 / 180 * pi
# covariance matrix
rotmat = np.array([[cos(theta), -sin(theta)],[sin(theta), cos(theta)]])
diagmat = np.diagflat(sigmas)
mean =np.array([−1,−2,−3])
# covar = rotmat @ diagmat @ rotmat.T
covar= np.array([[2, 2 ,0],[2 ,3, 1],[0, 1 ,19]])
print('covariance matrix:')
print(covar)`enter code here`
eigval, eigvec = np.linalg.eigh(covar)
print(f'eigenvalues: {eigval}\neigenvectors:\n{eigvec}')
print('angle of eigvector corresponding to larger eigenvalue:',
180 /pi * np.arctan2(eigvec[1,1], eigvec[0,1]))
# PCA
mean = data.mean(axis=0)
print('mean:', mean)
# S1: explicit sum
S1 = np.zeros((2,2), dtype=float)
print(len(data))
for i in range(len(data)):
S1 += np.outer(data[i] - mean, data[i] - mean)
S1 /= len(data)
print(f'S1= (explicit sum)\n{S1}')
# S2:
S2 = np.cov(data, rowvar=False, bias=True)
print(f'S2= (np.cov)\n{S2}')
# PCA:
lambdas, u = np.linalg.eigh(S2)
print(f'\nPCA\nlambda={lambdas}\nu=\n{u}')
u1 = u[:,1] # largest
print('u1=\n',u1)
print(f'first principal component angle: {180/pi*np.arctan2(u1[1], u1[0])}')
【问题讨论】:
-
您将
center传递给rng.multivariate_normal(...)。那应该是mean,而不是center。 -
请将您的相关代码(带有正确缩进)和错误信息以 text 形式发布,not 以图像形式发布。
-
相关代码从 import NumPy 开始滚动到下面,以 print(f'fractional Explained variance: {var_explained}') 结束,现在,我想将数据的前两个主成分绘制在二维散点图。什么是轴?从数值上验证重建点与原始数据之间的均方距离(测量的剩余方差)接近数据总方差和前两个主成分的解释方差比的预期值。
-
再次,请在此处以 text 的形式明确发布您的相关代码(
print(f'fractional explained variance: {var_explained}')无处可见 -rng.multivariate_normal来自哪里?);由于您使用的是随机生成的数据,因此这是 minimal reproducible example 的完美案例。请不要使用 cmets 空间来添加信息和说明 - 如有必要,请编辑和更新您的帖子。 -
# PCA mu = data.mean(axis=0) print('mean:', mu) # S1: 显式总和 S1 = np.zeros((2,2), dtype=float) print(len(data)) for i in range(len(data)): S1 += np.outer(data[i] - mu, data[i] - mu) S1 /= len(data) print(f' S1= (explicit sum)\n{S1}') # S2: S2 = np.cov(data, rowvar=False, bias=True) print(f'S2= (np.cov)\n{S2}') # PCA: lambdas, u = np.linalg.eigh(S2) print(f'\nPCA\nlambda={lambdas}\nu=\n{u}') u1 = u[:,1] # 最大打印(' u1=\n',u1) print(f'第一主成分角度:{180/pi*np.arctan2(u1[1], u1[0])}')
标签: python numpy machine-learning pca