在python中使用文本文件的协方差矩阵

时间:2018-04-17 12:22:48

标签: python numpy matrix statistics covariance

我有python读取的文本文件。

import numpy as np

with open("Input2010_5a.txt", "r") as file:
for line in file:
    date, long, lat, depth, temp, sal = line.split("\t")
    line_data = []
    line_data.append(float(date))
    line_data.append(float(long))
    line_data.append(float(lat))
    line_data.append(float(depth))
    line_data.append(float(temp))
    line_data.append(float(sal))

结果我在这样的观点中收到了41个列表:

[2010.36, 23.2628, 59.7768, 1.0, 4.1, 6.04] #it's one of them

现在我需要使用它们制作 协方差矩阵 。我不确定如何制作它。

3 个答案:

答案 0 :(得分:0)

txt文件

中提取您的列表

我首先会将您的文本文件中的列表提取到某种字典结构中,这类似于:

d = {}
with open("Input2010_5a.txt", "r") as file:
    counter = 0
    for line in file:
        date, long, lat, depth, temp, sal = line.split("\t")
        line_data = []
        line_data.append(float(date))
        line_data.append(float(long))
        line_data.append(float(lat))
        line_data.append(float(depth))
        line_data.append(float(temp))
        line_data.append(float(sal))
        d['list'+str(counter)] = line_data
        counter += 1

d将是一本字典,如下所示:

{'list0': [2010.36, 23.2628, 59.7768, 1.0, 4.1, 6.04], 
 'list1': [more, list, values, here], ...], ...
}

协方差矩阵方法1:numpy

您可以堆叠字典d中包含的41个列表,然后使用np.cov

import numpy as np

all_ls = np.vstack(d.values())

cov_mat = np.cov(all_ls)

然后返回您的协方差矩阵

协方差矩阵方法2:pandas

如果您希望以pandas表格形式提供相同的协方差矩阵,也可以使用pandas.cov来获取相同的协方差矩阵:

import pandas as pd

df=pd.DataFrame(d)

cov_mat = df.cov()

最小例子

如果您的txt文件类似于:

2010.36 23.2628 59.7768 1.0 4.1 6.04
2018.36 29.2    84  2.0 8.1 6.24
2022.36 33.8    99  3.0 16.2    6.5

方法1 的结果会给你:

array([[ 661506.97804414,  662002.706604  ,  661506.6953528 ],
       [ 662002.706604  ,  662576.37510667,  662123.94745333],
       [ 661506.6953528 ,  662123.94745333,  661701.07526667]])

方法2 会给你:

               list0          list1          list2
list0  661506.978044  662002.706604  661506.695353
list1  662002.706604  662576.375107  662123.947453
list2  661506.695353  662123.947453  661701.075267

答案 1 :(得分:0)

我发现np.cov如何计算协方差矩阵有点棘手。通过 i上的Wikipedia definition元素,j 位置是 ith jth 特征之间的协方差。举个例子:

  

二维空间中随机点集合的变化不能用一个数字完全表征,x和y方向的方差也不包含所有必要的信息; 2×2矩阵对于完全表征二维变化是必要的。

那就是说,因为你有6个维度,你应该有一个6x6矩阵。

之后,我做了一些研究,发现这个question使用了rowvar=False,如下所示:

import numpy as np
l1 = [2010.36, 23.2628, 59.7768, 1.0, 4.1, 6.04]
l2 = [2018.36, 29.2, 84, 2.0, 8.1, 6.24]
all_ls = np.vstack((l1,l2))
np.cov(all_ls, rowvar=False)

您可以构建all_ls堆叠尽可能多的l's,并且协方差矩阵仍然是6x6矩阵。

此外,您可以注意到np.cov计算作为参数传递的所有变量对的协方差。为了更好地理解它,我建议使用this问题,该问题显示当您未设置np.cov时,rowvar=False如何从输入中获取2x2矩阵

答案 2 :(得分:0)

我相信使用pandas可以做到以下几点:

from matplotlib import pyplot as plt
import seaborn as sns

plt.rcParams['figure.figsize'] = [40, 40]
plt.axis('scaled')
sns.heatmap(cov, 
        annot=True,
        cbar = False,
        fmt="0.2f",
        cmap="YlGnBu",
        xticklabels=range(len(cov)),
        yticklabels=range(len(cov)))
plt.title("Covariance matrix")

此外,如果您想可视化矩阵,则可以使用seaborn.heatmap

(41, 6)

协方差矩阵: 以下矩阵是使用数据id = localStorage.getItem('currentUser') this.http.get('./assets/id/profiles/admin.json') .subscribe(result => { this.profile = result.json(); }); 具有相同形状的随机矩阵生成的:

Covariance matrix