python – 计算相关矩阵子集的最快方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 计算相关矩阵子集的最快方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3446字,纯文字阅读大概需要5分钟。
内容图文
![python – 计算相关矩阵子集的最快方法](/upload/InfoBanner/zyjiaocheng/701/3fadadaa1b6147e3a5c126f65f582933.jpg)
我偏爱使用pandas内置corr方法来处理数据帧.但是,我试图计算具有45,000列的数据帧的相关矩阵.然后重复这250次.计算正在粉碎我的公羊(16 GB,mac book pro).我正在抓取结果相关矩阵的列的统计数据.所以我需要一列与其他列的相关性来计算这些统计数据.我的解决方案是计算列的子集与每个其他列的相关性,但我需要一种有效的方法来执行此操作.
考虑:
import pandas as pd
import numpy as np
np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(6, 4), columns=list('ABCD'))
df
我想计算[‘A’,’B’]的相关性
corrs = df.corr()[['A', 'B']]
corrs
我将通过计算平均值或其他一些统计数据来完成它.
我不能使用我用来创建示例的代码,因为当我扩展时,我没有内存.在执行计算时,它必须使用与所选列数成比例的内存量来计算相对于其他所有内容的相关性.
我正在寻找大规模最高性能的解决方案.我有一个解决方案,但我正在寻找其他想法,以确保我得到最好的.提供的任何答案都会返回正确的答案,如演示中所示,并且满足记忆约束将由我推翻(我鼓励彼此之间相互推销).
以下是我的代码:
def corr(df, k=0, l=10):
d = df.values - df.values.mean(0)
d_ = d[:, k:l]
s = d.std(0, keepdims=True)
return pd.DataFrame(d.T.dot(d[:, k:l]) / s.T.dot(s[:, k:l]) / d.shape[0],
df.columns, df.columns[k:l])
解决方法:
使用点积计算相关性(如在您的示例中)似乎是一种好方法.我将描述两个改进,然后代码实现它们.
改进1:拉出意味着点积
我们可以将这些方法从点积中拉出来,以避免从每个值中减去它们(类似于你从点积中拉出标准偏差的方式,我们也会这样做).
设x,y为具有n个元素的向量.让a,b成为标量.设< x,y>表示x和y之间的点积.
x和y之间的相关性可以使用点积表示
<(x-mean(x))/std(x), (y-mean(y))/std(y)> / n
为了从点积中拉出标准偏差,我们可以使用以下标识(如上所述):
<ax, by> = a*b*<x, y>
为了从dot产品中取出手段,我们可以获得另一个身份:
<x+a, y+b> = <x,y> + a*sum(y) + b*sum(x) + a*b*n
在a = -mean(x),b = -mean(y)的情况下,这简化为:
<x-mean(x), y-mean(y)> = <x, y> - sum(x)*sum(y)/n
使用这些身份,x和y之间的相关性相当于:
(<x, y> - sum(x)*sum(y)/n) / (std(x)*std(y)*n)
在下面的函数中,这将使用矩阵乘法和外部乘积来表示,以同时处理多个变量(如您的示例中所示).
改进2:预计算总和和标准偏差
我们可以预先计算总和和标准偏差,以避免每次调用函数时为所有列重新计算它们.
码
把这两个改进放在一起,我们有以下(我不会说熊猫,所以它是numpy):
def corr_cols(x, xsum, xstd, lo, hi):
n = x.shape[0]
return (
(np.dot(x.T, x[:, lo:hi]) - np.outer(xsum, xsum[lo:hi])/n)
/ (np.outer(xstd, xstd[lo:hi])*n)
)
# fake data w/ 10 points, 5 dimensions
x = np.random.rand(10, 5)
# precompute sums and standard deviations along each dimension
xsum = np.sum(x, 0)
xstd = np.std(x, 0)
# calculate columns of correlation matrix for dimensions 1 thru 3
r = corr_cols(x, xsum, xstd, 1, 4)
更好的代码
预先计算和存储总和和标准差可以隐藏在闭包内,以提供更好的界面并使主代码更清晰.在功能上,操作等同于先前的代码.
def col_correlator(x):
n = x.shape[0]
xsum = np.sum(x, 0)
xstd = np.std(x, 0)
return lambda lo, hi: (
(np.dot(x.T, x[:, lo:hi]) - np.outer(xsum, xsum[lo:hi])/n)
/ (np.outer(xstd, xstd[lo:hi])*n)
)
# construct function to compute columns of correlation matrix
cc = col_correlator(x)
# compute columns of correlation matrix for dimensions 1 thru 3
r = cc(1, 4)
编辑:( piRSquared)
我想把我的编辑放在这篇文章中,以进一步鼓励提出这个答案.
这是我使用这个建议实现的代码.这个解决方案在大熊猫和numpy之间来回转换.
def corr_closure(df):
d = df.values
sums = d.sum(0, keepdims=True)
stds = d.std(0, keepdims=True)
n = d.shape[0]
def corr(k=0, l=10):
d2 = d.T.dot(d[:, k:l])
sums2 = sums.T.dot(sums[:, k:l])
stds2 = stds.T.dot(stds[:, k:l])
return pd.DataFrame((d2 - sums2 / n) / stds2 / n,
df.columns, df.columns[k:l])
return corr
使用案例:
corr = corr_closure(df)
corr(0, 2)
内容总结
以上是互联网集市为您收集整理的python – 计算相关矩阵子集的最快方法全部内容,希望文章能够帮你解决python – 计算相关矩阵子集的最快方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。