Python根据corellation矩阵生成数字

Python根据corellation矩阵生成数字,python,correlation,Python,Correlation,您好,我正在尝试生成尽可能靠近第一个表的相关数据(总共13行中的前三行)。还显示了相关列的相关矩阵(corr_total) 我正在尝试显示错误的以下代码: “LinalError:第4个前导小调非正定” 我的问题是mu和sigma的值是什么,以及如何解决上面显示的错误。 谢谢 我已经编辑了问题以显示原始表格。它显示了四名患者的数据。我基本上想为更多的病例制作合成数据,以复制这些患者的模式感谢您回答我关于您何时可以访问数据的问题。您收到的错误是在调用cholesky时生成的。cholesky要求矩

您好,我正在尝试生成尽可能靠近第一个表的相关数据(总共13行中的前三行)。还显示了相关列的相关矩阵(corr_total)

我正在尝试显示错误的以下代码: “LinalError:第4个前导小调非正定”

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

感谢您回答我关于您何时可以访问数据的问题。您收到的错误是在调用cholesky时生成的。cholesky要求矩阵是半正定的。检查矩阵是否半正定的一种方法是查看其所有特征值是否都大于零。相关/共变矩阵的一个特征值几乎为零。我认为乔尔斯基只是在挑三拣四。Use可以使用
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)

你有权获得数据的平均值和协方差矩阵吗?嗨,我刚刚得到了实际的值表(裁剪为3行,如图所示),然后我从中计算了相关矩阵(如上所示)。嗨,alex,非常感谢你的回答,我使用了相关矩阵,因为我看到它被多次使用,比如这里:我编辑了这个问题,以显示整个原始数据表及其上下文。我想听听你的意见thoughts@Ray92我认为乔尔斯基只是在挑三拣四。我用一个变通方法更新了我的答案。您链接的那篇文章会生成相关数据,但它没有正确的中心或宽度。您好,下面是答案的前两行:数组([[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之间的整数患者分数),数组中也有负数,这在我的情况下没有意义。我接受了答案,谢谢亚历克斯,但你能详细说明我上面的评论吗?我非常感谢,谢谢!
s = np.random.multivariate_normal(mu, cov, size=number_of_sample)