在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,θ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 \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−α∂θj∂J(θ)∂θj∂J(θ)=(hθ(x)−y)xj误差:J(θ)=21i=1∑m(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−XminX−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()