Python 如何优化皮尔逊&x27;通过调整权重得到的相关系数?

Python 如何优化皮尔逊&x27;通过调整权重得到的相关系数?,python,python-3.x,numpy,linear-regression,pearson-correlation,Python,Python 3.x,Numpy,Linear Regression,Pearson Correlation,我想调整权重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

我想调整权重
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_平方的代码是什么


谢谢你@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

我愿意打赌有一些封闭形式的解决方案,但如果黑客代码足够,请参见下文

(此解决方案基于scipy.optimize包 )

(通过返回-1乘以r_平方,最小化变为最大化)


非常感谢。我可以忽略导入IPython的
吗?因为我在尝试安装IPython时出错。如果没有ipython,它仍然可以工作。我可以问一下
w1,w2,w3=args[0]
的含义吗?传递数组是在最小化中的,这很棘手。w1,w2,w3=args[0]是实现这一点的一个技巧。(如果您可以让IPython导入工作并取消对嵌入的注释,它将在IPython会话中删除您,您可以查看get_linregress函数中的args值。
[1,2,3]
w
的初始值吗?我也尝试了
[1,1,1]
得到了不同的结果。所以我担心结果可能是局部最小值,而不是全局最小值?谢谢@mathew gunther。我有多个
x_raw=np.数组([x1_raw,x2_raw,x3_raw])
y
。如何重新编写函数,使
x_raw
y
也可以作为参数?
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