len () объекта без размера - cvxpy - максимизация корреляции - PullRequest
0 голосов
/ 17 февраля 2019
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

1 Ответ

0 голосов
/ 17 февраля 2019

Ваша ошибка связана с тем, что pearsonr ожидает передачи двух массивов, таких как входные данные x и y.

Вы создали массивы X и Y в своем коде, да.Но если вы проверите тип X * weights (то, что вы фактически передаете pearsonr), вы увидите, что он имеет тип cvxpy.atoms.affine.binary_operators.MulExpression, который не имеет атрибута длины, и поэтому len(X * weights) выдаетошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...