在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θ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
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−XminX−Xmin
3.实验过程:
首先,导入CSV文件“adv.csv”,其次,写出误差函数和梯度下降函数
然后读取CSV文件中的值,传入梯度下降函数中进行运算
接着作图,可视化
最后重复上述操作,运算文件中别的值:
从结果中可以看到。我们所找到的那条分类线并不是我们所设想中最好的一条,事实上,在一开始的实验时,我并没有成功的画出那一条分类线,后来做了归一化之后,才成功将其显示出来,但可能由于我选取的点的问题,导致画出的分类线并不是我们最想要的那条。
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()



