【问题标题】:How to optimise the Pearson's correlation coefficient by adjusting the weights?如何通过调整权重来优化 Pearson 相关系数?
【发布时间】:2018-03-20 12:20:30
【问题描述】:

我想调整权重w 以优化 Pearson 相关系数的 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])wnfev 是函数评估的数量; 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

【问题讨论】:

    标签: python python-3.x numpy linear-regression pearson-correlation


    【解决方案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
    

    【讨论】:

    • 谢谢!我可以忽略import 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.array([x1_raw, x2_raw, x3_raw])y。如何重写函数,使x_rawy也可以作为参数?
    猜你喜欢
    • 2019-09-16
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多