Как оптимизировать коэффициент корреляции Пирсона, регулируя веса?

Я хотел бы настроить вес w, чтобы оптимизировать r-квадрат коэффициента корреляции Пирсона.

import numpy as np
from scipy import stats

x1_raw=np.array([277, 115, 196])
x2_raw=np.array([263, 118, 191])
x3_raw=np.array([270, 114, 191])

w=np.array([w1, w2, w3])

x1=np.prod([w,x1_raw], axis=0).sum()
x2=np.prod([w,x2_raw], axis=0).sum()
x3=np.prod([w,x3_raw], axis=0).sum()

x=np.array([x1, x2, x3])

y=np.array([71.86, 71.14, 70.76])

slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
r_squared = r_value**2

Итак, каков код для настройки [w1, w2, w3], чтобы максимизировать r_squared?


Спасибо @mathew gunther

Результат, который я получил от print(res):

final_simplex: (array([[ 0.41998763,  2.66314965,  3.34462572],
  [ 0.4199877 ,  2.66314968,  3.34462654],
  [ 0.41998749,  2.66314983,  3.34462649],
  [ 0.41998765,  2.66314917,  3.34462607]]), array([-1., -1., -1., -1.]))
      fun: -0.99999999999999822
  message: 'Optimization terminated successfully.'
     nfev: 130
      nit: 65
   status: 0
  success: True
        x: array([ 0.41998763,  2.66314965,  3.34462572])

Я могу понять, что x: array([ 0.41998763, 2.66314965, 3.34462572]) это w; nfev — количество вычислений Функции; nit - количество итераций

Но каковы следующие параметры?

array([[ 0.41998763,  2.66314965,  3.34462572],
  [ 0.4199877 ,  2.66314968,  3.34462654],
  [ 0.41998749,  2.66314983,  3.34462649],
  [ 0.41998765,  2.66314917,  3.34462607]])

array([-1., -1., -1., -1.]))
status: 0

person lanselibai    schedule 20.03.2018    source источник


Ответы (1)


Я готов поспорить, что есть какое-то решение в закрытой форме, но если взломанного кода достаточно, см. Ниже

(это решение основано на пакете scipy.optimize https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html)

(минимизация превращается в максимизацию, возвращая -1 умноженное на r_squared)

import numpy as np
from scipy import stats
from scipy import optimize
import IPython

def get_linregress(*args):

    #IPython.embed()
    w1,w2,w3 = args[0]

    x1_raw=np.array([277, 115, 196])
    x2_raw=np.array([263, 118, 191])
    x3_raw=np.array([270, 114, 191])

    w=np.array([w1, w2, w3])
    #w=np.array([1, 1, 1])

    x1=np.prod([w,x1_raw], axis=0).sum()
    x2=np.prod([w,x2_raw], axis=0).sum()
    x3=np.prod([w,x3_raw], axis=0).sum()

    x=np.array([x1, x2, x3])

    y=np.array([71.86, 71.14, 70.76])

    slope, intercept, r_value, p_value, std_err = stats.linregress(x,y) r_squared = r_value**2

    return -1*r_squared

res = optimize.minimize(get_linregress, [1,2,3], method='Nelder-Mead', tol=1e-6)

res.x
person mathew gunther    schedule 20.03.2018
comment
спасибо! Могу ли я игнорировать import IPython, так как я получил ошибку при попытке установить ipython. Он по-прежнему работает без ipython. - person lanselibai; 21.03.2018
comment
Могу я также спросить значение w1,w2,w3 = args[0]? - person lanselibai; 21.03.2018
comment
передача массива в минимизацию была сложной. w1,w2,w3 =args[0] был уловкой, чтобы это произошло. (Если вы можете заставить импорт IPython работать и раскомментировать вставку, вы попадете в сеанс ipython, и вы сможете посмотреть значение args в функции get_linregress. - person mathew gunther; 21.03.2018
comment
Является ли [1,2,3] начальными значениями для w? Я также попробовал [1,1,1] и получил другой результат. Поэтому я беспокоюсь, что результаты могут быть локальным минимумом, а не глобальным минимумом? - person lanselibai; 22.03.2018
comment
Спасибо @mathew gunther. У меня несколько x_raw=np.array([x1_raw, x2_raw, x3_raw]) и y. Как переписать функцию, чтобы x_raw и y также могли быть аргументом? - person lanselibai; 22.03.2018
comment
Не могли бы вы подробнее рассказать о w1,w2,w3 =args[0] ? Я могу только понять, что *arg должно принимать неограниченное количество аргументов. - person lanselibai; 22.03.2018
comment
Для res = optimize.minimize(get_linregress, [1,2,3], method='Nelder-Mead', tol=1e-6), почему нам не нужно предоставлять аргумент get_linregress, вместо этого мы помещаем [1,2,3] вне функции? - person lanselibai; 22.03.2018