AI学习——线性回归和梯度下降

在AI的学习过程中主要有理论课的知识讲解和实验课的实验过程,这里主要就分享我写的实验报告吧

1.实验问题:对线性回归和梯度下降算法的应用。

  • 线性回归:是一种常用的机器学习模型,主要任务是预测,预测包括分类和回归。
  • 梯度下降:梯度下降就是用来求某个函数最小值时自变量对应取值,该某个函数指的是误差函数,也叫损失函数。损失函数就是一个自变量为算法的参数,函数值为误差值的函数。所以梯度下降就是找让误差值最小时候算法取的参数。

2.模型构建:

  • 线性回归
    h ( x ) = ∑ i = 1 n θ i X i = θ T X ( x 0 = 1 , θ 0 ⋅ 1 ) θ = ( X T X ) − 1 X T Y h(x)=\sum_{i=1}^n\theta_i{X}_i= \theta^TX (x_0 = 1 , \theta_0·1)\\\theta = (X^{T}X)^{-1}X^TY h(x)=i=1nθiXi=θTX(x0=1,θ01)θ=(XTX)1XTY
样本数关系参数
1=1唯一解
1<2无解
2>1可能有最优解

注:复杂度太多太大时,有时很难求出解。

  • 梯度下降
    θ j : = θ j − α ∂ ∂ θ j J ( θ ) ∂ ∂ θ j J ( θ ) = ( h θ ( x ) − y ) x j 误 差 : J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x i ) − y i ) 2 \begin{aligned} &\theta_j: =\theta_j-\alpha \frac{\partial }{\partial \theta_j} J(\theta)\\ &\frac{\partial }{\partial \theta_j}J(\theta) = (h_\theta(x)-y)x_j\\ &误差: J(\theta)=\frac{1}{2}\sum_{i=1}^m(h_\theta(x^i)-y^i)^2 \end{aligned} θj:=θjαθjJ(θ)θjJ(θ)=(hθ(x)y)xj:J(θ)=21i=1m(hθ(xi)yi)2

迭代停止设置:1.迭代次数;2.相邻两次迭代的误差

局部最小值:可以通过丰富初始值以避免该情况发生

马鞍点:继续训练直到走出马鞍点

归一化算法

X ′ = X − X m i n X m a x − X m i n X'=\frac{X-X_{min}}{X_{max}-X_{min}} X=XmaxXminXXmin

3.实验过程:

  • 首先,导入CSV文件“adv.csv”,其次,写出误差函数和梯度下降函数
    在这里插入图片描述

  • 然后读取CSV文件中的值,传入梯度下降函数中进行运算
    在这里插入图片描述

  • 接着作图,可视化
    在这里插入图片描述

  • 最后重复上述操作,运算文件中别的值:
    在这里插入图片描述
    在这里插入图片描述

4.实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.结果分析:

从结果中可以看到。我们所找到的那条分类线并不是我们所设想中最好的一条,事实上,在一开始的实验时,我并没有成功的画出那一条分类线,后来做了归一化之后,才成功将其显示出来,但可能由于我选取的点的问题,导致画出的分类线并不是我们最想要的那条。

6.代码补充:

import matplotlib.pyplot as plt
import numpy as np
import csv 
import pandas

df = pandas.read_csv('adv.csv')	#导入文件

def J(x,y,a):	#损失函数
    Jtemp = 0
    for xtemp, ytemp in zip(x, y):
        Jtemp += (a[0] + a[1] * xtemp - ytemp) ** 2
        return Jtemp/2

def gradient_decent(x,y):	#梯度下降
    a=[0,0]
    for i in range(1000):
        print(J(x,y,a))
        for xtemp, ytemp in zip(x, y):	#线性回归
            a[1] = a[1] - 0.01*(a[0]+a[1]*xtemp-ytemp)*xtemp 
            a[0] = a[0] - 0.01*(a[0]+a[1]*xtemp-ytemp)*1
        return a
    
    
x = df['wechat']	#微信
y = df['sales']
x_ = (x-np.min(x))/(np.max(x)-np.min(x))	#归一化


y_ = (y-np.min(y))/(np.max(y)-np.min(y))
for x0,y0 in zip (x_,y_):
    plt.plot(x0, y0, 'r*')
    
a = gradient_decent(x_,y_)
xp = np.linspace(0, 1, 2)
yp = a[0]+ a[1] * xp

plt.plot(xp, yp)

plt.show()
print(xp)
print(yp)
print(a[0])
print(a[1])

w = df['weibo']		#微博
w_ = (w-np.min(w))/(np.max(w)-np.min(w))
y_ = (y-np.min(y))/(np.max(y)-np.min(y))

for w0,y0 in zip (w_,y_):
    plt.plot(w0, y0, 'g*')
    
b = gradient_decent(x_,y_)
wp = np.linspace(0, 1, 2)
yp2 = b[0]+ b[1] * wp
plt.plot(wp, yp2)
plt.show()

e = df['others']	#其他
y = df['sales']
e_ = (x-np.min(e))/(np.max(e)-np.min(e))
y_ = (y-np.min(y))/(np.max(y)-np.min(y))

for e0,y0 in zip (e_,y_):
    plt.plot(e0, y0, 'b*')
    
c = gradient_decent(x_,y_)
ep = np.linspace(0, 1, 5)
yp3 = c[0]+ c[1] * ep
plt.plot(ep, yp3)
plt.show()
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值