斯坦福ML课程——python转写(Week3—视频Advanced Optimization例子)

本文介绍了将Stanford机器学习课程中Week3视频中的Octave代码转写为Python的过程,主要使用了`scipy.optimize.minimize`函数。在转写过程中遇到fun函数返回值类型错误的问题,并分享了解决方案。尽管得到了相同的theta值,但计算出的cost值与视频中的不同,可能是未正确应用梯度函数导致。作者欢迎读者指正错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在完成视频中的函数整理之后,决定用python对视频中的例子进行转写,先从简单的开始。

首先就是寻找python中的函数是否可以替代上一篇文章中所整理的函数fminunc(),最终参考了作者为csdn_inside 这篇文章,感谢大神!

文章链接:https://www.twblogs.net/a/5bf35646bd9eee37a142e45a/zh-cn

视频中Octave代码如下:

python转写如下:

import numpy as np
import scipy.optimize as op

def costFunction(theta, X, Y):
    jVal = np.square((theta[0] - Y)) + np.square((theta[1] - Y));
    gradient = np.zeros([2,1]);
    gradient[0] = X * (theta[0] - Y);
    gradient[1] = X * (theta[1] - Y);
    return jVal

if __name__ == "__main__":
    X = 2
    Y = 5
    initial_theta = np.zeros([1,2]);
    result = op.minimize(fun=costFunction, x0=initial_theta, args=(X, Y), method='SLSQP',options= {'maxiter': 100})
    print(result)

 

scipy.optimize.minimize(funx0args=()method=Nonejac=Nonehess=Nonehessp=Nonebounds=Noneconstraints=()tol=Nonecallback=Noneoptions=None)

官方网址:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html

总结一下我写代码是所出现的问题:

  1. 没有仔细看help文档:其中fun要求输入的是一维数组,并且要求返回的是一个float类型的值,由于我的不仔细(我一直按照视频中返回的是jVal和gradient),程序一直出错: TypeError: unsupported operand type(s) for -: 'tuple' and 'tuple'。最后去掉gradient,程序就可以正常运行了。
  2. 在得到运行结果之后,theta的值可以得到和视频中的一样,但是对于fun的值,即cost的值,无论我试了各种函数结果都跟视频中的不同,这个问题一直没有解决掉。如果各位大神发现问题,请给予指正,谢谢。上述代码结果如下(视频中cost=1.5777e-030,theta:5,5):

今天在写练习的时候发现我的梯度函数并没有使用,所以加入梯度函数,但是cost值依然不同

"""
Created on Tue Nov  5 14:15:42 2019

@author: lonely_hanhan
"""
import numpy as np
#import pandas as pd
import scipy.optimize as op

def costFunction(theta, X, Y):
    jVal = np.square((theta[0] - Y)) + np.square((theta[1] - Y));
    return jVal

def gradient(theta, X, Y):
    grad = np.zeros([2,1]);
    grad[0] = X * (theta[0] - Y);
    grad[1] = X * (theta[1] - Y);
    return grad.flatten()

if __name__ == "__main__":
    X = 2
    Y = 5
    initial_theta = np.zeros([1,2]);
    result = op.minimize(fun=costFunction, x0=initial_theta, args=(X, Y), method='TNC',  jac=gradient, options= {'maxiter': 100})
    print(result)

 为了记录自己的学习进度同时也加深自己对知识的认知,刚刚开始写博客,如有错误或者不妥之处,请大家给予指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值