1. 在上一篇博客中我们通过解析解法算出来了


    但是上面公式中的对称阵是N维乘以N维的,复杂度为O(n*n*n),虽然很精准但是很慢。

    此我们引入梯度下降法

我们首先大致画出MSE的图像,MSE是一个开口向下,有最小值的凸函数,它的图像如下图。


其中θ为模型w0~wn,纵轴为MSE的值。
由图可知,该图像上点的梯度会随着位置变化,当在θ ̂(MSE最小)时,梯度为零。

由图可知,在图中我们初始了一个θ,将这个θ代入梯度下降法公式,我们便可以求出下一个时刻的θ
其中梯度下降法的公式为:

其中:α为计算机的学习率(不变,由人工设定),g为(θ=θt)时的梯度
为此,要让我们计算机用梯度下降法求最小MSE只需执行以下4个步骤即可;
1:求初始化θ,设定学习率α
2:求梯度g
3:代入公式,判断g是否等于0
4:当g等于0时,停止

接下来我们对MSE函数求导,找到g的关系。

为此,在日常的算法中,我们结合两种方法,一般我们采用小批量的随机梯度下降法

接下来,我们用代码分别实现批量梯度下降法和随机梯度下降法。

批量梯度下降法:

import  numpy as np
import matplotlib.pyplot as plt#模拟数据
#模拟100行1列X的数据
X = 2* np.random.rand(100,1)
y = 4+3*X +np.random.randn(100,1)#将X于1列100行连接
X_b = np.c_[np.ones((100,1)),X]# print(X_b)
#学习率阿尔法的设定
learning_rate = 0.01
#设置迭代次数
n_interations= 10000
m= 100#第一步:初始化
theta  = np.random.randn(2,1)
count = 0#第二步;代入公式for interation in range(n_interations):count +=1#求梯度index = np.random.randint(m)#切片Xi = X_b[index:index+1]yi = y[index:index+1]gradients =  Xi.T.dot(Xi.dot(theta)-yi)#随机梯度下降法只要把求梯度改成#带入梯度下降公式theta = theta- learning_rate*gradientsprint(count)
print(theta)#绘图
X_new = np.array([[0],[2]])X_new_b = np.c_[(np.ones((2,1))),X_new]print(X_new_b)y_predict = X_new_b.dot(theta)# print(y_predict)
#绘图模块
plt.plot(X_new,y_predict,'r-')
plt.plot(X,y,'b.')
plt.axis([0,2,0,15])
plt.show()

运行结果:

批量梯度下降法:

import  numpy as np
import matplotlib.pyplot as plt#模拟数据
#模拟100行1列X的数据
X = 2* np.random.rand(100,1)
y = 4+3*X +np.random.randn(100,1)#将X于1列100行连接
X_b = np.c_[np.ones((100,1)),X]# print(X_b)
#学习率阿尔法的设定
learning_rate = 0.01
#设置迭代次数
n_interations= 1000000
m= 100#第一步:初始化
theta  = np.random.randn(2,1)
count = 0#第二步;代入公式for interation in range(n_interations):count +=1#求梯度gradients = 1/m *X_b.T.dot(X_b.dot(theta)-y)print(count)
print(theta)#绘图
X_new = np.array([[0],[2]])X_new_b = np.c_[(np.ones((2,1))),X_new]print(X_new_b)y_predict = X_new_b.dot(theta)# print(y_predict)
#绘图模块
plt.plot(X_new,y_predict,'r-')
plt.plot(X,y,'b.')
plt.axis([0,2,0,15])
plt.show()

运行结果:

最后介绍一种学习率调参的方法,其实梯度下降法就正如我们找山下的地雷一般,而学习率的大小正如你步子的大小一样,如果你的步子太大,可能一下子就跨过了地雷,无法将地雷找出来,若是你的学习率的太小,则所用的时间会很长很长,我们正确的方法应该是步子大小随着下山步子数的增多而变小,为此我介绍一种学习率调参的方法;
“`
import numpy as np

模拟数据

模拟100行1列X的数据

X = 2* np.random.rand(100,1)
y = 4+3*X +np.random.randn(100,1)
X_b = np.c_[np.ones((100,1)),X]

n_epochs = 1000#伦次,把已有的数据学更多的次数
t0,t1 = 5,500#超参数

m = 100#100行

学习率

定义调参方法

def learning_schedule(t):
return t0/(t+t1)

初始化

theta = np.random .randn(2,1)

for epoch in range(n_epochs):
for i in range(m):
random_index = np.random.randint(m)
xi = X_b[random_index:random_index+1]
yi = y[random_index:random_index+1]
gradients = 2*xi.T.dot(xi.dot(theta)-yi)
learning_rate = learning_schedule(epoch*m+i)
theta = theta - learning_rate*gradients

print(theta)

绘图

X_new = np.array([[0],[2]])

X_new_b = np.c_[(np.ones((2,1))),X_new]

print(X_new_b)

y_predict = X_new_b.dot(theta)

print(y_predict)

绘图模块

plt.plot(X_new,y_predict,’r-‘)
plt.plot(X,y,’b.’)
plt.axis([0,2,0,15])
plt.show()

总结:这种方法相比解析式求θ法来说更好理解,但用解析式求的更精确,但这种方法更偏向于猜,因为我还没有学到如何使用抽取部分数据的批量梯度下降法,等学到了也会分享给大家。
本人人工智能小白,欢迎各位指正我的这篇文章,与我讨论其中的问题。

一种更简单的求最小平方均值函数(MSE)的方法 -- 梯度下降法。相关推荐

  1. 最小均方误差的推导+最小二乘法、梯度下降法、牛顿法、高斯牛顿法

    最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小.最小二乘法 ...

  2. SimMIM:一种更简单的MIM方法

    自从何恺明的MAE(←点击蓝字查看文章详情)出来之后,基于MIM(Masked Image Modeling)的无监督学习方法越来越受到关注.这里介绍一篇和MAE同期的工作:SimMIM: A Sim ...

  3. panda 满足条件的行 index_Excel – 困扰很久的跳过隐藏行粘贴,2 种更简单的方法了解一下...

    跳过隐藏行/列复制不难,只要选取区域以后按 Alt+; 就可以了:但是要跳过隐藏行/列粘贴的话,就不那么容易了. 我曾经写过一个解决方案,具体可参见 Excel 实用 tips(七) – 粘贴时如何跳 ...

  4. 几种常用的优化方法梯度下降法、牛顿法、)

                                                                       几种常用的优化方法 1. 前言 熟悉机器学习的童鞋都知道,优化方法 ...

  5. 从AI、加密货币到火星任务,一种更强大、更稳定的存储设备

    作者:贺佳 来源:数据实战派 所研究器件之一的显微镜图像,由两个尺寸相同的十字架组成,其中一个具有 IrMn3 柱,第二个仅由 Pt 组成.(来源:西北大学和墨西拿大学) 美国西北大学和意大利墨西拿大 ...

  6. 【转】更简单的非递归遍历二叉树的方法

    [转]更简单的非递归遍历二叉树的方法 解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出 ...

  7. 一种非常简单的静态网页生成方法介绍

    一.目前的静态页生成方法有简单的模板替换.常见的ASP+FSO等,这里给大家介绍一种更简单的方法.原理就是借助XMLHTTP对象获取目标页面的源代码,然后写入到静态网页文件中.代码如下: Code D ...

  8. 更简单的非递归遍历二叉树

    解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所 ...

  9. 三星s20 android auto,Automagic一个更简单的方式来自动化您的Android手机 | MOS86

    你有没有想过你的智能手机会在你回家的时候开始播放音乐?当你关闭社交网络的时候怎么样?Automagic是一种替代方案,通过使用易于理解的流程图执行许多相同的任务,向用户提供了一种更简单的自动化Andr ...

最新文章

  1. python opencv 视频剪辑
  2. 多维数组的索引与切片_「GCTT 出品」Go 系列教程——11. 数组和切片
  3. 160个Crackme032用ProcessMonitor拆解KeyFile保护
  4. axure7.0元件库 安卓_AxureRP 7.0 元件库下载
  5. MyBatisPlus中全局Sql注入器应用_逻辑删除使用
  6. linux系统——fread()与read()函数族区别
  7. apache 错误日志 File does not exist: 解决办法
  8. 查看深信服上网管理版本号和登陆流程
  9. 编写properties文件的Eclipse插件
  10. 敲代码时如何快速移动光标_如何用 Linux 技巧大大提高工作效率?
  11. 【LDPC系列1】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真
  12. 毕业典礼留学生代表发言:中国是我可亲可敬可爱的第二故乡,我已修炼出一颗中国心!...
  13. 五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?
  14. 9.28 csp-s模拟测试54 x+y+z
  15. 关于生活工作学习之感悟-第一篇
  16. 090925 H 广联达之道 培训笔记
  17. hdu 1671 Phone List (字典树)
  18. C语言指针函数和函数指针区别
  19. java image 提取色彩通道_Java:从BufferedImage中提取Alpha通道
  20. 在kile上通过串口实现scanf输入和printf打印

热门文章

  1. 55寸电视尺寸长宽高多少
  2. 达文教育2022年John Locke主题讲座再度来袭
  3. 基于SpringBoot+Vue前后端分离的在线教育平台项目
  4. 【其他】结构技术优化算法--蚁群算法(ant colony optimization)
  5. miui 10 android 9,MIUI 10稳定版刚到 基于安卓9的MIUI10 8.9.7开发版也来了
  6. [经验教程]拼多多退店保证金多久到账 拼多多退店正确操作35天内保证金到账
  7. 在线英文广播电视资源
  8. 【备战春招/秋招系列】美团Java面经总结终结篇 (附详解答案)
  9. These songs can cheer you up when life gets hard
  10. iOS提交应用至App Store流程