我对使用SciPy还比较陌生;我目前正在使用它来最小化多层感知器模型的成本函数。我不能使用scikit learn,因为我需要有能力设置系数(它们在MLPClassifer中是只读的)并向任何和所有参数添加随机排列和噪声。我还没有完成实现,但是我对最小化函数所需的参数感到困惑。你知道吗
例如,我编写了一个函数来计算函数的“代价”(能量最小化),它同时计算梯度。这没什么特别的,因为这是惯例。但是,打电话的时候scipy.优化.最小化,它要求两个不同的函数:一个返回要最小化的标量(即,在我的例子中是成本),另一个计算当前状态的梯度。示例:
j,grad = myCostFunction(X,y)
除非我弄错了,否则它似乎需要调用我的函数两次,每次调用都需要指定返回代价或梯度,如下所示:
opt = scipy.optimize.minimize(fun=myJFunction, jac=myGradFunction, args = args,...)
这不是在浪费计算时间吗?我的数据集将是>;100万个样本和10个特征,因此减少冗余计算将是首选,因为我将为我的项目培训和再培训这件事数万次。你知道吗
另一个混淆点是args输入。参数是这样传递的:
# This is what I expect happens
myJFunction(x0,*args)
myGradFunction(x0,*args)
或者像这样:
# This is what I wish it did
myJFunction(x0,arg0,arg1,arg2)
myGradFunction(x0,arg3,arg4,arg5)
提前谢谢!你知道吗
在做了一些实验和搜索之后,我找到了我自己问题的答案。你知道吗
虽然我不能确定
scipy.optimize.minimize
函数,但是使用其他优化函数(例如,scipy.optimize.fmin_tnc
)显式声明可调用函数func
可以(1)返回能量和梯度,(2)返回能量并为参数fprime
指定梯度函数(较慢),或者(3)只返回能量,让函数通过扰动估计梯度(慢得多)。你知道吗参见此处的文档:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.fmin_tnc.html
我很高兴看到我只能用一个函数返回两个参数。我假设
minimize
函数也是这种情况,但我还没有测试过它(请参见编辑1)至于我的第二个问题,如果您指定了两个不同的函数,
*args
参数将被传递给两个函数;您不能为这两个函数指定单独的参数。你知道吗编辑1:阅读
minimize
文档更多,如果参数jac
设置为True
,那么优化器假设func
返回能量和梯度。仔细阅读这些文件似乎很有帮助。你知道吗相关问题 更多 >
编程相关推荐