import numpy as np
import pandas as pd
from scipy.stats.stats import pearsonr
from cvxpy import Variable, Problem, Maximize
X = np.random.rand(1000, 4)
Y = np.random.rand(1000, 4)
weights = Variable(4,)
constraints = []
def get_correlation(a):
return pearsonr(X * a, Y *a)
obj = Maximize(get_correlation(weights))
problem = Problem(obj, constraints)
problem.solve()
我正在尝试使用 cvxpy 来查找向量权重的值,以执行两个矩阵的线性变换。目标函数是两个变换矩阵之间 PIL 逊相关性的最大化。
我不明白为什么会收到以下错误。
4 def get_correlation(a):
----> 5 return pearsonr(X * a, Y *a)
6
7 obj = Maximize(get_correlation(weights))
~/Python/global/lib/python3.6/site-packages/scipy/stats/stats.py in pearsonr(x, y)
3030 x = np.asarray(x)
3031 y = np.asarray(y)
-> 3032 n = len(x)
3033 mx = x.mean()
3034 my = y.mean()
TypeError: len() of unsized object
最佳答案
您的错误是因为pearsonr
期望传递两个类似输入的数组 x
和y
.
您创建了数组 X
和Y
在你的代码中,是的。但是如果你检查 X * weights
的类型(这就是您实际传递给 pearsonr
的内容)您会看到它的类型为 cvxpy.atoms.affine.binary_operators.MulExpression
,它没有长度属性,所以 len(X * weights)
抛出错误。
关于python - 未调整大小的对象的 len() - cvxpy - 相关性最大化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736650/