下午。我在脚本上遇到了一些麻烦。具体而言,当特征值的子集的总和大于.9*所有特征值的总和时,我想保持单数值及其相应的特征向量。到目前为止,IV'E能够使用循环和附加函数来创建代表单数值和特征向量的元组列表。但是,当我尝试在for循环中嵌套if语句以满足条件时,我会破坏它。这是我的代码。
o = np.genfromtxt (r"C:UsersPythonDesktopPCADUMMYDATADUMP.csv", delimiter=",")
o_m=np.matrix(o)
#We define the covariance matrix of our data accordingly This is the mean centered data approx
#of the covariance matrix.
def covariance_matrix(x):
#create the mean centered data matrix. this is the data matrix minus the matrix augmented from the vector that represents the column average
m_c_d=x-np.repeat(np.mean(x, axis=0,), len(x), axis=0)
#we compute the matrix operations here
m_c_c=np.multiply(1/((len(m_c_d)-1)),np.transpose(m_c_d)*m_c_d)
return m_c_c
#Define the correlation matrix for our mean adjsuted data matrix
def correlation_matrix(x):
C_M = covariance_matrix(x)
#matrix operation is diagonal(covariance_matrix)^-1/2*(covaraince_matrix)*diagonal(covariance_matrix)^-1/2
c_m=fractional_matrix_power(np.diag(np.diag(C_M)),-1/2)*C_M*fractional_matrix_power(np.diag(np.diag(C_M)),-1/2)
return c_m
def s_v_d(x):
C_M=covariance_matrix(x)
#create arrays that hold the left singular vectors(u), the right singular vectors(v), and the singular values (s)
u,s,v=np.linalg.svd(C_M)
#not sure if we should keep this here but this is how we can grab the eigenvalues which are the sqares of the singular values
eigenvalues=np.square(s)
singular_array=[]
for i in range(0,len(s)-1):
if np.sum(singular_array,axis=1) < (.9*np.sum(s)):
singular_pairs=[s[i],v[:,i]]
singular_array.append(singular_pairs)
else:
break
return np.sum(s,axis=0)
具体来说,请考虑在单数[阵列]之后循环。谢谢!
我认为您的singular_array
及其"混合"标量/向量元素比np.sum
可以处理的要多一点。我不是100%确定的,但不是差异值的方差吗?换句话说,您不应该使用eigenvalues
做出决定吗?
无论如何,这是一种非循环方法:
part_sums = np.cumsum(eigenvalues)
cutoff = np.searchsorted(part_sums, 0.9 * part_sums[-1])
singular_array = list(zip(s[:cutoff], v[:, :cutoff]))
如果您认为更合适的情况,将eigenvalues
更改为s
。
如何工作:
cumsum
计算eigenvalues
上的运行总和。因此,其最后一个元素是总和,我们只需要找到part_sums
超过90%的位置即可。这就是searchsorted
对我们所做的。
一旦我们截止了所有剩余的剩余,将其应用于单数值和向量,并使用zip
对成对。