我有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
现在我需要使用它们制作 协方差矩阵 。我不确定如何制作它。
答案 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();
});
具有相同形状的随机矩阵生成的: