【问题标题】:Multivariate polynomial fit on soccer data足球数据的多元多项式拟合
【发布时间】:2014-01-21 22:10:36
【问题描述】:

我有一些数据试图拟合三个多项式。我已经为 Home、Draw 和 Away 三列中的每一列分别安装了多边形。问题是有一个约束

Home+Draw+Away=1

以下代码计算每一列的多项式系数。

home_coeffs = polyfit(match_rating, y_home,1)
draw_coeffs = polyfit(match_rating, y_draw,2)
away_coeffs = polyfit(match_rating, y_away,2)

如何强制执行约束或将问题重新表述为多变量多项式拟合?

    Home    Draw    Away
MatchRating             
-26     0.000000    0.000000    1.000000
-24     0.000000    0.000000    1.000000
-22     0.500000    0.000000    0.500000
-21     0.111111    0.333333    0.555556
-20     0.250000    0.000000    0.750000
-19     0.500000    0.333333    0.166667
-18     0.100000    0.000000    0.900000
-17     0.111111    0.222222    0.666667
-16     0.187500    0.375000    0.437500
-15     0.240000    0.120000    0.640000
-14     0.272727    0.272727    0.454545
-13     0.214286    0.250000    0.535714
-12     0.219512    0.463415    0.317073
-11     0.333333    0.214286    0.452381
-10     0.208955    0.238806    0.552239
-9  0.357143    0.285714    0.357143
-8  0.430556    0.291667    0.277778
-7  0.283784    0.405405    0.310811
-6  0.288462    0.298077    0.413462
-5  0.402299    0.218391    0.379310
-4  0.379630    0.259259    0.361111
-3  0.420561    0.317757    0.261682
-2  0.426752    0.292994    0.280255
-1  0.452174    0.260870    0.286957
0   0.419118    0.330882    0.250000
1   0.553957    0.251799    0.194245
2   0.514925    0.268657    0.216418
3   0.483333    0.308333    0.208333
4   0.465347    0.326733    0.207921
5   0.575758    0.202020    0.222222
6   0.587500    0.212500    0.200000
7   0.584615    0.230769    0.184615
8   0.594203    0.275362    0.130435
9   0.609375    0.312500    0.078125
10  0.714286    0.122449    0.163265
11  0.780000    0.160000    0.060000
12  0.769231    0.128205    0.102564
13  0.764706    0.117647    0.117647
14  0.653846    0.230769    0.115385
15  0.826087    0.130435    0.043478
16  0.500000    0.375000    0.125000
17  1.000000    0.000000    0.000000
18  1.000000    0.000000    0.000000
19  0.714286    0.142857    0.142857
20  1.000000    0.000000    0.000000
21  0.666667    0.333333    0.000000
22  1.000000    0.000000    0.000000
26  1.000000    0.000000    0.000000

我在这里制作的地块:

【问题讨论】:

    标签: python numpy pandas interpolation


    【解决方案1】:

    您可以使用scipy.optimize.leastsq()。完整代码如下:

    import pandas as pd
    import io
    import numpy as np
    
    txt = """    Home    Draw    Away
    -26     0.000000    0.000000    1.000000
    -24     0.000000    0.000000    1.000000
    -22     0.500000    0.000000    0.500000
    -21     0.111111    0.333333    0.555556
    -20     0.250000    0.000000    0.750000
    -19     0.500000    0.333333    0.166667
    -18     0.100000    0.000000    0.900000
    -17     0.111111    0.222222    0.666667
    -16     0.187500    0.375000    0.437500
    -15     0.240000    0.120000    0.640000
    -14     0.272727    0.272727    0.454545
    -13     0.214286    0.250000    0.535714
    -12     0.219512    0.463415    0.317073
    -11     0.333333    0.214286    0.452381
    -10     0.208955    0.238806    0.552239
    -9  0.357143    0.285714    0.357143
    -8  0.430556    0.291667    0.277778
    -7  0.283784    0.405405    0.310811
    -6  0.288462    0.298077    0.413462
    -5  0.402299    0.218391    0.379310
    -4  0.379630    0.259259    0.361111
    -3  0.420561    0.317757    0.261682
    -2  0.426752    0.292994    0.280255
    -1  0.452174    0.260870    0.286957
    0   0.419118    0.330882    0.250000
    1   0.553957    0.251799    0.194245
    2   0.514925    0.268657    0.216418
    3   0.483333    0.308333    0.208333
    4   0.465347    0.326733    0.207921
    5   0.575758    0.202020    0.222222
    6   0.587500    0.212500    0.200000
    7   0.584615    0.230769    0.184615
    8   0.594203    0.275362    0.130435
    9   0.609375    0.312500    0.078125
    10  0.714286    0.122449    0.163265
    11  0.780000    0.160000    0.060000
    12  0.769231    0.128205    0.102564
    13  0.764706    0.117647    0.117647
    14  0.653846    0.230769    0.115385
    15  0.826087    0.130435    0.043478
    16  0.500000    0.375000    0.125000
    17  1.000000    0.000000    0.000000
    18  1.000000    0.000000    0.000000
    19  0.714286    0.142857    0.142857
    20  1.000000    0.000000    0.000000
    21  0.666667    0.333333    0.000000
    22  1.000000    0.000000    0.000000
    26  1.000000    0.000000    0.000000"""
    df = pd.read_csv(io.BytesIO(txt), delim_whitespace=True, index_col=0)
    
    from scipy import optimize
    
    x = df.index.values
    y1 = df.Home.values
    y2 = df.Draw.values
    y3 = df.Away.values
    
    def f(params):
        a, b, c, d, e = params
        oy1 = a + b*x
        oy2 = c + d*x + e*x*x
        oy3 = 1.0 - oy1 - oy2
        return oy1, oy2, oy3
    
    def error(params):
        oy1, oy2, oy3 = f(params)
        e1 = y1 - oy1
        e2 = y2 - oy2
        e3 = y3 - oy3
        return np.concatenate((e1, e2, e3))
    
    params = optimize.leastsq(error, [1, 1, 1, 1, 1])[0]
    
    oy1, oy2, oy3 = f(params)
    
    import pylab as pl
    pl.plot(x, y1)
    pl.plot(x, oy1)
    
    pl.plot(x, y2)
    pl.plot(x, oy2)
    
    pl.plot(x, y3)
    pl.plot(x, oy3)
    

    这是输出:

    这里是参数:

    [  4.97460839e-01   1.71243863e-02   2.74933473e-01  -1.58439751e-03
      -3.48952223e-04]
    

    【讨论】:

    • 是的,可爱!但是,我看不到如何从 scipy 导入?我将该代码复制粘贴到 ipython 笔记本中,但 ImportError: No module named scipy
    • facepalm 谢谢,我真的很感激!
    猜你喜欢
    • 2017-02-03
    • 2010-09-27
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2016-10-11
    • 2012-08-05
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多