【问题标题】:len() of unsized object - cvxpy - correlation maximization未大小对象的 len() - cvxpy - 相关性最大化
【发布时间】:2019-02-17 19:06:56
【问题描述】:
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 来查找向量权重的值,以执行两个矩阵的线性变换。目标函数是两个变换矩阵之间的皮尔逊相关性的最大化。

我不明白为什么会出现以下错误。

      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

【问题讨论】:

  • 对,你的问题是......?
  • 我不明白为什么我在求解程序时得到 `len() of unsized object'

标签: python convex-optimization cvxpy


【解决方案1】:

您的错误是因为 pearsonr 期望传递两个数组,例如输入 xy

您在代码中创建了数组XY,是的。但是,如果您检查 X * weights 的类型(这是您实际传递给 pearsonr 的类型),您会看到它的类型为 cvxpy.atoms.affine.binary_operators.MulExpression,它没有长度属性,因此 len(X * weights) 会抛出一个错误。

【讨论】:

  • 我明白了。有没有其他方法可以用 cvxpy 解决这个问题而不会出现这个问题?
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2010-12-05
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2013-09-26
相关资源
最近更新 更多