如标题所示,我想生成一个随机的N x d矩阵(这里N代表实例数量,d代表特征数量),其中每一列都与其他列线性独立。我该如何使用numpy和python来实现相同的功能?
import numpy as np
N, d = 1000, 200
M = np.random.rand(N,1)
r = 1 #matrix rank
while r < d:
t = np.random.rand(N,1)
if np.linalg.matrix_rank(np.hstack([M,t])) > r:
M = np.hstack([M,t])
r+=1
d
次。Nxd
2d数组并检查其秩:M = np.random.rand(N,d)
r = np.linalg.matrix_rank(M)
while r < d:
M = np.random.rand(N,d)
r = np.linalg.matrix_rank(M)
即使我们添加检查并最终生成另一个随机的二维数组,也很可能永远不会进入 while 循环。
如果你的观察次数较少,仍然可能会出现一定程度的相关性,仅仅是由于偶然因素。
确保这一点的方法之一是使用主成分得分。以下是来自wiki的简要解释:
重复此过程可产生一个正交基,其中数据的不同个体维度不相关。这些基向量称为主成分,与几个相关程序主成分分析(PCA)有关。
我们可以在下面看到这一点:
from sklearn.decomposition import PCA
import numpy as np
import seaborn as sns
N = 50
d = 20
a = np.random.normal(0,1,(50,20))
pca = PCA(n_components=d)
pca.fit(a)
pc_scores = pca.transform(a)
fig, ax = plt.subplots(1, 2,figsize=(10,4))
sns.heatmap(np.corrcoef(np.transpose(a)),ax=ax[0],cmap="YlGnBu")
sns.heatmap(np.corrcoef(np.transpose(pc_scores)),ax=ax[1],cmap="YlGnBu")
矩阵上的热图显示,即使是从标准正态分布中随机抽取,但在样本量较小的情况下,仍可能存在一定程度的相关性。