Python 如何确定比例因子,使协方差矩阵的第一个元素为1?
我有数据,我需要居中和缩放,以便围绕原点居中。然后需要旋转数据,以便最大方差的方向位于x轴上。然后计算数据的平均值和协方差。我需要协方差矩阵的第一个元素是1。我认为这是通过调整比例因子来实现的,但我不知道比例因子应该是什么 为了使数据居中,我去掉了平均值,为了旋转,我使用SVD,但缩放仍然是我的问题Python 如何确定比例因子,使协方差矩阵的第一个元素为1?,python,scaling,covariance,svd,Python,Scaling,Covariance,Svd,我有数据,我需要居中和缩放,以便围绕原点居中。然后需要旋转数据,以便最大方差的方向位于x轴上。然后计算数据的平均值和协方差。我需要协方差矩阵的第一个元素是1。我认为这是通过调整比例因子来实现的,但我不知道比例因子应该是什么 为了使数据居中,我去掉了平均值,为了旋转,我使用SVD,但缩放仍然是我的问题 signature = numpy.loadtxt(name, comments = '%', usecols = (0,cols-1)) signature = numpy.transpose(s
signature = numpy.loadtxt(name, comments = '%', usecols = (0,cols-1))
signature = numpy.transpose(signature)
#SVD to get D so that data can be scaled by 1/(highest singular value in D)
U, D, Vt = numpy.linalg.svd( signature , full_matrices=0)
cs = utils.centerscale(signature, scale=False)
signature = cs[0]
#plt.scatter(cs[0][0],cs[0][1],color='r')
#SVD so that data can be rotated so that direction of most variance is on x-axis
U, D, Vt = numpy.linalg.svd( signature , full_matrices=0)
cs = utils.centerscale(signature, center=False, scalefactor=D[0])
U, D, Vt = numpy.linalg.svd( cs[0] , full_matrices=0)
D = numpy.diag(D)
norm = numpy.dot(D,Vt)
以下是标准均值和cov结果的示例(测试用例使用res)
除了协方差矩阵的第一个元素,所有值都是不相关的,该元素必须是一
我试着到处找,但找不到答案。任何帮助都将不胜感激 我不知道utils.centerscale是什么或做什么,但如果您想通过常数因子缩放矩阵,使其协方差矩阵的左上角项为1,只需将矩阵除以未缩放协方差项的平方根即可:
>>> import numpy
>>> numpy.random.seed(17)
>>> m = numpy.random.rand(5,4)
>>> m
array([[ 0.294665 , 0.53058676, 0.19152079, 0.06790036],
[ 0.78698546, 0.65633352, 0.6375209 , 0.57560289],
[ 0.03906292, 0.3578136 , 0.94568319, 0.06004468],
[ 0.8640421 , 0.87729053, 0.05119367, 0.65241862],
[ 0.55175137, 0.59751325, 0.48352862, 0.28298816]])
>>> c = numpy.cov(m,bias=1)
>>> c
array([[ 0.0288779 , 0.00524455, 0.00155373, 0.02779861, 0.01798404],
[ 0.00524455, 0.00592484, -0.00711072, 0.01006019, 0.00631144],
[ 0.00155373, -0.00711072, 0.13391344, -0.10551922, 0.00945934],
[ 0.02779861, 0.01006019, -0.10551922, 0.11250984, 0.00982862],
[ 0.01798404, 0.00631144, 0.00945934, 0.00982862, 0.01444482]])
>>> numpy.cov(m/c[0][0]**0.5, bias=1)
array([[ 1. , 0.18161135, 0.05380354, 0.96262562, 0.62276138],
[ 0.18161135, 0.20516847, -0.24623392, 0.3483699 , 0.21855613],
[ 0.05380354, -0.24623392, 4.63722877, -3.65397781, 0.32756326],
[ 0.96262562, 0.3483699 , -3.65397781, 3.89605297, 0.34035085],
[ 0.62276138, 0.21855613, 0.32756326, 0.34035085, 0.5002033 ]])
但这与将协方差矩阵除以左上角成员具有相同的效果:
>>> (numpy.cov(m,bias=1)/numpy.cov(m,bias=1)[0][0])/(numpy.cov(m/c[0][0]**0.5, bias=1))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
根据您所做的工作,您可能还会对
numpy.corrcoef
感兴趣,它会给出相关系数矩阵。谢谢,这帮了大忙。
>>> (numpy.cov(m,bias=1)/numpy.cov(m,bias=1)[0][0])/(numpy.cov(m/c[0][0]**0.5, bias=1))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])