为矩阵生成线性无关的列

4

如标题所示,我想生成一个随机的N x d矩阵(这里N代表实例数量,d代表特征数量),其中每一列都与其他列线性独立。我该如何使用numpy和python来实现相同的功能?

3个回答

2
如果你只是随机生成向量,那么列向量不线性独立的几率非常小(假设 N >= d)。
令 A = [B | x],其中 A 是一个 N x d 矩阵,B 是一个具有独立列向量的 N x (d-1) 矩阵,x 是一个具有 N 个元素的列向量。所有 x 的集合没有约束条件,其维数为 N;而所有 x 的集合,使得 x 不与 B 中的所有列向量线性独立,其维数为 d-1(因为 B 中的每个列向量都是该集合的基向量)。
由于你正在处理有限、离散的数字(可能是双精度浮点数或整数),矩阵不线性独立的概率不会完全为零。一般来说,每个元素可以取的可能值越多,矩阵具有独立列向量的可能性就越大。
因此,我建议你随机选择元素。你始终可以通过计算其列阶梯形式来验证矩阵是否具有线性独立的列向量。你可以使用 np.random.rand(N,d) 来实现这一点。

1
一种保证随机独立列的方法是迭代添加一个随机列并检查矩阵秩:
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 循环。


0

如果你的观察次数较少,仍然可能会出现一定程度的相关性,仅仅是由于偶然因素。

确保这一点的方法之一是使用主成分得分。以下是来自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")

enter image description here

矩阵上的热图显示,即使是从标准正态分布中随机抽取,但在样本量较小的情况下,仍可能存在一定程度的相关性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接