栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

基于梯度下降的线性回归算法实现_线性回归的梯度下降算法?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于梯度下降的线性回归算法实现_线性回归的梯度下降算法?

在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}^ntheta_i{X}_i= theta^TX (x_0 = 1 , theta_0·1)\theta = (X^{T}X)^{-1}X^TY h(x)=∑i=1n​θi​Xi​=θTX(x0​=1,θ0​⋅1)θ=(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 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 θj​:=θj​−α∂θj​∂​J(θ)∂θj​∂​J(θ)=(hθ​(x)−y)xj​误差:J(θ)=21​∑i=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′=Xmax​−Xmin​X−Xmin​​

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()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783699.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号