画3D 图 。from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmfig = plt.figure()ax = fig.gca(projection='3d')x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)surf = ax.plot_surface(X, Y, g((X,Y)), rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)cset = ax.contour(X, Y, g((X,Y)), zdir='z',offset=-5, cmap=cm.coolwarm)fig.colorbar(surf, shrink=0.5, aspect=5);
曲线拟合
曲线拟合和最优化有什么关系?
曲线拟合的问题是,给定一组数据,它可能是沿着一条线散布的,这时要找到一条最优的曲线来拟合这些数据,也就是要找到最好的线来代表这些点,这里的最优是指这些点和线之间的距离是最小的,这就是为什么要用最优化问题来解决曲线拟合问题 。
举例说明,给一些点,找到一条线,来拟合这些点 。
先给定一些点:N = 50 # 点的个数m_true = 2 # 斜率b_true = -1 # 截距dy = 2.0 # 误差np.random.seed(0)xdata = https://www.04ip.com/post/10 * np.random.random(N) # 50 个 x , 服从均匀分布ydata = np.random.normal(b_true + m_true * xdata, dy) # dy 是标准差plt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');
上面的点整体上呈现一个线性关系,要找到一条斜线来代表这些点,这就是经典的一元线性回归 。目标就是找到最好的线,使点和线的距离最短 。要优化的函数是点和线之间的距离,使其最小 。点是确定的,而线是可变的,线是由参数值,斜率和截距决定的 , 这里就是要通过优化距离找到最优的斜率和截距 。
点和线的距离定义如下:def chi2(theta, x, y): return np.sum(((y - theta[0] - theta[1] * x)) ** 2)
上式就是误差平方和 。
误差平方和是什么?有什么作用?
误差平方和公式为:
误差平方和大,表示真实的点和预测的线之间距离太远,说明拟合得不好,最好的线,应该是使误差平方和最?。醋钣诺哪夂舷撸?这里是条直线 。
误差平方和就是要最小化的目标函数 。
找到最优的函数 , 即斜率和截距 。theta_guess = [0, 1] # 初始值theta_best = opt.minimize(chi2, theta_guess, args=(xdata, ydata)).xprint(theta_best)[-1.01442005 1.93854656]
上面两个输出即是预测的直线斜率和截距,我们是根据点来反推直线的斜率和截距,那么真实的斜率和截距是多少呢?-1 和 2,很接近了,差的一点是因为有噪音的引入 。xfit = np.linspace(0, 10)yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');
最小二乘(Least Square)是什么?
上面用的是 minimize 方法,这个问题的目标函数是误差平方和,这就又有一个特定的解法,即最小二乘 。
最小二乘的思想就是要使得观测点和估计点的距离的平方和达到最?。饫锏摹岸恕敝傅氖怯闷椒嚼炊攘抗鄄獾阌牍兰频愕脑督ㄔ诠藕河镏小捌椒健背莆岸恕保? ,“最小”指的是参数的估计值要保证各个观测点与估计点的距离的平方和达到最小 。
关于最小二乘估计的计算,涉及更多的数学知识,这里不想详述,其一般的过程是用目标函数对各参数求偏导数 , 并令其等于 0,得到一个线性方程组 。具体推导过程可参考斯坦福机器学习讲义 第 7 页 。def deviations(theta, x, y): return (y - theta[0] - theta[1] * x)theta_best, ier = opt.leastsq(deviations, theta_guess, args=(xdata, ydata))print(theta_best)[-1.01442016 1.93854659]
最小二乘 leastsq 的结果跟 minimize 结果一样 。注意 leastsq 的第一个参数不再是误差平方和 chi2,而是误差本身 deviations,即没有平方,也没有和 。yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');
推荐阅读
- 虚拟主机icd网站源码,httpd 虚拟主机
- ios13怎么插卡,苹果13怎么插sim卡
- python爬虫存到excel的简单介绍
- python函数参数检查 python怎么看函数的参数
- 视频抖动用什么软件调好,视频抖动用什么软件调好一点
- js对象按顺序排列,js按字段排序
- 斗鱼直播1012132,斗鱼直播回放在哪里
- go语言云空间 golang 云计算
- 小米660x路由器怎么样,小米ax5400路由器怎么样