Python-根据相关矩阵生成数字

4

enter image description hereenter image description here

enter image description here

你好,我正在尝试生成与第一个表格尽可能接近的相关数据(展示了13行中的前三行)。相关列的相关矩阵也显示在其中(corr_total)。

我正在尝试以下代码,但出现了错误:“LinAlgError:第4个主要子式不是正定的”

from scipy.linalg import cholesky

# Correlation matrix

# Compute the (upper) Cholesky decomposition matrix

upper_chol = cholesky(corr_total)

# What should be here? The mu and sigma of one row of a table?
rnd = np.random.normal(2.57, 0.78, size=(10,7))


# Finally, compute the inner product of upper_chol and rnd
ans = rnd @ upper_chol

我的问题是mu和sigma的值是什么,以及如何解决上面显示的错误。 谢谢! 附言:我已经编辑了问题,以展示原始表格。它显示了四名患者的数据。我基本上想为更多病例生成合成数据,以复制这些患者中发现的模式。

你是否可以访问数据的均值和协方差矩阵? - alexdor
嗨,我刚刚得到了实际值表格(裁剪为3行并显示),然后从中计算了相关矩阵(也在上面显示)。 - Ray92
1个回答

4
感谢您回答我关于数据访问时间的问题。您收到的错误是在调用cholesky时生成的。cholesky需要您的矩阵是正半定的。检查矩阵是否半正定的一种方法是查看其所有特征值是否大于零。您的相关/ 协方差矩阵中的一个特征值几乎为零。我认为cholesky只是有点挑剔。您可以使用scipy.linalg.sqrtm进行替代分解。
对于您关于多元正态分布生成的问题,您生成的随机正态应该是标准随机正态,即平均值为0,宽度为1。 Numpy提供了标准随机正态分布器np.random.randn。 要生成多元正态分布,还应该获取协方差的分解,而不是相关矩阵。以下代码将使用仿射变换生成多元正态分布,如您的问题所述。
from scipy.linalg import cholesky, sqrtm
relavant_columns = ['Affecting homelife',
           'Affecting mobility',
           'Affecting social life/hobbies',
           'Affecting work',
           'Mood',
           'Pain Score',
           'Range of motion in Doc']

# df is a pandas dataframe containing the data frame from figure 1
mu = df[relavant_columns].mean().values
cov = df[relavant_columns].cov().values
number_of_sample = 10


# generate using affine transformation
#c2 = cholesky(cov).T
c2 = sqrtm(cov).T
s = np.matmul(c2, np.random.randn(c2.shape[0], number_of_sample)) + mu.reshape(-1, 1)

# transpose so each row is a sample
s = s.T 

Numpy还具备一个内置函数,可以直接生成多元正态分布。
s = np.random.multivariate_normal(mu, cov, size=number_of_sample)

嗨Alex,非常感谢你的回答。我使用相关矩阵是因为我看到它被多次使用,比如在这里:https://quantcorner.wordpress.com/2018/02/09/generation-of-correlated-random-numbers-using-python/。 - Ray92
我已经编辑了问题,展示了原始数据的整个表格及其上下文。我很想听听您的想法。 - Ray92
@Ray92 我认为Cholesky只是有点挑剔。我在我的回答中更新了一个解决方法。你提供的文章可以生成相关数据,但它可能没有正确的中心或宽度。 - alexdor
嗨,以下是答案的前两行: array([[0.86314047、1.47526447、0.73896043、0.86314047、0.32524867、 2.68821546、1.56054772], [1.76109361、-0.14059524、0.49934849、1.76109359、0.80724597、 3.81200796、1.76765357]。我的问题是这些数字不在原始表格中数字的范围内(即介于1和7之间的整数患者评分),并且数组中有负数,在我的情况下没有意义。 - Ray92
我接受了答案,谢谢Alex,但是你可以详细阐述一下我的评论吗?我将非常感激,谢谢! - Ray92
显示剩余3条评论

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