scipy优化pandas数据框

2024-10-03 21:35:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着找,但结果很差。在

有人能给我解释一下怎么表演吗优化.最小化在Pandas DataFrame上,DataFrame和result列中的类别之间的错误最小化

考虑这个例子:

import pandas as pd

df = pd.DataFrame({'prod': ['prod1', 'prod2', 'prod3', 'prod4', 'prod5', 'prod6'],
                   'cat': ['cat1', 'cat1', 'cat2', 'cat2', 'cat3', 'cat1'],
                   'dog': ['dog1', 'dog2', 'dog1', 'dog2', 'dog2', 'dog3'],
                   'result': [20, 10, 30, 50, 45, 120]})

对于每个cat1、cat2、cat3、dog1、dog2和dog3,我希望找到最小化该等式的值:

^{pr2}$

我可以在Excel中使用Solver复制这个

prod    cat     dog result  cat*dog abs
prod1   cat1    dog1    20  17.38   2.61
prod2   cat1    dog2    10  27.34   17.35
prod3   cat2    dog1    30  26.91   3.09
prod4   cat2    dog2    50  42.32   7.67
prod5   cat3    dog2    45  45.00   0.00
prod6   cat1    dog3    120 20.64   99.36

所以我想找到的最终分数是:

平均绝对值22/平均结果45.83=0.47

以下是解算器为动物返回的值:

cat1    3.59194254
cat2    5.559980313
cat3    5.91078751
dog1    4.840109868
dog2    7.613201994
dog3    5.746396256

如何在Python中复制它?在


Tags: dataframeprodresultcatpddogcat1cat2
1条回答
网友
1楼 · 发布于 2024-10-03 21:35:10

您需要定义一个optimize.minimize可以运行的函数(以便它知道它试图最小化什么)。在

import pandas as pd
import numpy as np
from scipy import optimize

df = pd.DataFrame({'prod': ['prod1', 'prod2', 'prod3', 'prod4', 'prod5', 'prod6'],
                   'cat': ['cat1', 'cat1', 'cat2', 'cat2', 'cat3', 'cat1'],
                   'dog': ['dog1', 'dog2', 'dog1', 'dog2', 'dog2', 'dog3'],
                   'result': [20, 10, 30, 50, 45, 120]})

因此,让我们像您所描述的那样定义animal_error函数-第一个参数是一个1d数组,其中包含一些值(根据优化的需要)。第二个参数是这些数组值对应的字符串,第三个参数是数据帧。大多数代码只是将数据帧字符串转换为可以计算的值。在

^{pr2}$

现在,可以将字符串组成数组:

^{3}$

为解算器设置合理的初始值:

initial = np.repeat(np.sqrt(df['result'].mean()), animals.size)

运行最小化程序:

res = optimize.minimize(animal_error, args=(animals, df), x0=initial, method = 'Nelder-Mead', options={'maxiter':10000})
res_df = pd.DataFrame({'animal': animals, 'min_val':res.x})

最终结果如下:

>>> res.fun
0.08676411624175694

  animal    min_val
0   dog1   3.754194
1   dog2   5.296533
2   dog3  22.526566
3   cat1   5.327044
4   cat2   9.307979
5   cat3   8.496109

我认为你的成本函数描述可能有点偏离,所以你可能需要调整一下。在

相关问题 更多 >