梯度下降 线性回归2021-04-16( 二 )

<= 0.001:break#使用随机梯度下降法b1 = 0.1#对 b1 赋值a1 = 0.1#对 a1 赋值count1 = 0b1_list = []a1_list = []for num in range(10000):count1 += 1diss = 0#误差deriv2 = 0#对 b1 偏导deriv3 = 0#对 a1 偏导#求导for i in range(m):deriv2 += (b1+a1*x[i]-y[i])/mderiv3 += ((b1+a1*x[i]-y[i])/m)*x[i]#更新 b 和 afor i in range(m):b1 = b1 - alpha*((b1+a1*x[i]-y[i])/m) a1 = a1 - alpha*((b1+a1*x[i]-y[i])/m)*x[i]#求损失函数 L(a,b)rand_i = random.randrange(0,m)diss = diss + (1/(2*m))*pow((b1+a1*x[rand_i]-y[rand_i]),2)b1_list.append(b1)a1_list.append(a1)#如果误差已经很小,则退出循环if diss <= 0.001:break print("批量梯度下降最终得到b={},a={}".format(b,a))print("得到的回归函数是:y={}+{}*x".format(b,a))print("随机梯度下降最终得到b={},a={}".format(b1,a1))print("得到的回归函数是:y={}+{}*x".format(b1,a1))#画原始数据图和函数图matplotlib.rcParams['font.sans-serif'] = ['SimHei']plt.plot(x,y,'bo',label='数据',color='black')plt.plot(x,[b+a*x for x in x],label='批量梯度下降',color='red')plt.plot(x,[b1+a1*x for x in x],label='随机梯度下降',color='blue')plt.xlabel('x(零件个数)')plt.ylabel('y(加工时间)')plt.legend()plt.show()plt.scatter(range(count0),b_list,s=1)plt.scatter(range(count0),a_list,s=1)plt.xlabel('上方为b,下方为a')plt.show()plt.scatter(range(count1),b1_list,s=3)plt.scatter(range(count1),a1_list,s=3)plt.xlabel('上方为b,下方为a')plt.show()
代码运行结果:
其余的两个图像感兴趣的同学可以给我留言,我会在第一时间回评 。
以下观点大多借鉴,欢迎大佬指教 。
【梯度下降线性回归2021-04-16】3,多元线性回归及梯度下降* 3.1 定义数据
以下面一组数据为例子:
以上角标作为行索引,以下角标作为列索引
第二行可以写成: x ( 2 ) = [ 916 1201 5 . . . 33 ] x^{(2)}=\begin{} 916\\1201\\5\\...\\33 \end{} x(2)=???????...33????????
位于第二行第一列的数字写成:
x 1 ( 2 ) = 916 x^{(2)}_1=916 x1(2)?=916
以下角标来区分位置,以便于后期运算 。
3.2 定义函数
(1)设置一个回归方程:

梯度下降  线性回归2021-04-16

文章插图
h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 + . . . + θ n x n h_\theta(x)=\+\ x_1+\+\+...+\ hθ?(x)=θ0?+θ1?x1?+θ2?x2?+θ3?x3?+...+θn?xn?
(2)添加一个列向量:
x 0 = [ 1 1 1 1... 1 ] T x_0=\begin{} 1&1&1&1...&1\end{}^T x0?=[1?1?1?1...?1?]T
这里的上角标T表示 x 0 x_0 x0?矩阵的倒置,就是由行到列变为由列到行,使得其满足矩阵乘法的要求 。
这样方程可以写为:
h θ ( x ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 + . . . + θ n x n h_\theta(x)=\+\ x_1+\+\+...+\ hθ?(x)=θ0?x0?+θ1?x1?+θ2?x2?+θ3?x3?+...+θn?xn?
既不会影响到方程的结果,而且使x与 θ \theta θ的数量一致以便于矩阵计算 。
为了方便表达,分别记为:
X = [ x 0 x 1 x 2 x 3 . . . x n ] , θ = [ θ 0 θ 1 θ 2 θ 3 . . . θ n ] X=\begin{} x_0\\x_1\\x_2\\x_3\\...\\x_n \end{},\theta=\begin{} \\\\\\\\\\\\...\\\ \end{} X=?????????x0?x1?x2?x3?...xn???????????,θ=?????????θ0?θ1?θ2?θ3?...θn???????????
方程再次变形:
h θ ( x ) = [ θ 0 θ 1 θ 2 θ 3 . . . θ n ] T [ x 0 x 1 x 2 x 3 . . . x n ] h_\theta(x)=\begin{} \&\&\&\&...&\ \end{}_T\begin{} x_0\\x_1\\x_2\\x_3\\...\\x_n \end{} hθ?(x)=[θ0??θ1??θ2??θ3??...?θn??]T??????????x0?x1?x2?x3?...xn???????????
(3)由回归方程推导出损失方程:
3.3应用梯度下降
计算时要一个一个计算,以确保数据统一变化 。在执行次数足够多的迭代后,就能取得达到要求的 θ j \ θj?的值 。
3.4 著名的鸢尾花数据集
Iris 鸢尾花数据集内包含 3 类,分别为山鸢尾(Iris-)、变色鸢尾(Iris-)和维吉尼亚鸢尾(Iris-),共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这 4 个特征预测鸢尾花卉属于哪一品种 。这是本文章所使用的鸢尾花数据集: sl:花萼长度 ;sw:花萼宽度 ;pl:花瓣长度 ;pw:花瓣宽度; type:类别:(Iris-、Iris-、Iris- 三类)