线性回归——练习题

时间:2023-01-28 00:15:23

一个特征值

  • 加载数据,将数据赋给x和y两个向量;
    此处使用numpy模块对数组进行处理data = np.loadtxt(‘data1’,delimiter=’、’),此时data为包含两列数据的数组;
    计算data的行数,将第一列赋给x,第二列赋给y
m = np.size(data,0)
x=data[:,0]#数据切片,取所有行的第一列,为一行数据
y=data[:,1]#去所有行的第二列,一行数据
  • 画出原始数据的散点图
fig,ax = plt.subplots(1,2,figsize(20,10))
a[0].scatter(x,y,c='r',marker='x')
ax[0].plot(x, mx.dot(theta))
ax[0].set_title('Original scatterplot and Predict line')

如图:
线性回归——练习题

  • 代价函数

    • 数据整理
    theta = np.zeros(2)
    mx = x.reshape((m,1))
    mx = np.hstack((np.ones((m,1)),mx))
    my = y.reshape((m,1))
    • 代价函数实现
    def costFunc(theta, x, y):
     m, n = x.shape#m为x的行数,n为x的列数
     theta = theta.reshape((n, 1))
     y = y.reshape((m, 1))#重复做事防止y没被标准化m行1列的形式
     err = x.dot(theta) - y
     J = 0.5*(np.sum(err*err))/m
     return J
  • 使用梯度下降法最小化代价函数
    δ δ θ 0 J ( θ 0 , θ 1 ) = 1 m i = 1 n ( h θ ( x ( i ) ) y ( i ) )
    δ δ θ 1 J ( θ 0 , θ 1 ) = 1 m i = 1 n ( h θ ( x ( i ) ) y ( i ) ) x ( i ) )

def gradient(theta, x, y):
    m, n = x.shape
    theta = theta.reshape((n, 1))
    y0 = y.reshape((m, 1))
    y1 = x.dot(theta)
    grad = ((x.T).dot(y1-y0))/m
    #注意x的转置,因为θ0是乘以的1,所以x是添加了1位列的,转置后刚好得到
    return grad.flatten()

iters = 15000#迭代次数
alpha = 0.01#学习速率

def gradientSolve(theta, x, y, alpha, iters):
    alpha *= 1.0
    jhistory = []
    theta = theta.flatten()
    while iters > 0:
        deri = gradient(theta, x, y)
        theta = theta - alpha*deri
        jhistory.append(costFunc(theta, x, y))
        iters -= 1
    return theta, jhistory
    #theta为梯度下降法迭代后的最后theta值,后面为每一次迭代后的代价函数值,为了画图

代价函数随迭代次数的图像如图:
线性回归——练习题
- 代价函数的3D曲面图,轴标为 θ 0 θ 1
根据原始数据的散点图可以大致确定 θ 0 θ 1 的取值范围分别为(-10,10)和(-1,4)
针对每一对 θ 0 θ 1 的取值都对应一个相应的代价函数的取值。所以代价函数的3D曲面图如下:

def visualCost3D(x, y):
    theta0 = np.linspace(-10, 10, 200)#在指定的间隔内返回均匀间隔的数字
    theta1 = np.linspace(-1, 4, 200)
    jvals = np.zeros((theta0.size, theta1.size))
    for i in np.arange(0, theta0.size):
        for j in np.arange(0, theta1.size):
            #水平(按列顺序)把数组给堆叠起来,返回结果为numpy的数组
            theta = np.hstack((theta0[i], theta1[j])).T
            jvals[i, j] = costFunc(theta, x, y)
    fig = plt.figure()
    ax = Axes3D(fig)
    #meshgrid函数通常在数据的矢量化上使用,适用于生成网格型数据,可以接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对。
    x, y = np.meshgrid(theta0, theta1)
    ax.plot_surface(x, y, jvals.T, cmap='rainbow')
    ax.set_title('Cost Function Surface')

图像如图所示:
线性回归——练习题
- 等高线图

#等高线图
def contour(res, x, y):
    fig, ax = plt.subplots()
    res = res.flatten()#返回一个折叠成一维的数组
    theta0 = np.linspace(-10, 10, 200)
    theta1 = np.linspace(-1, 4, 200)
    jvals = np.zeros((theta0.size, theta1.size))
    for i in np.arange(0, theta0.size):
        for j in np.arange(0, theta1.size):
            theta = np.hstack((theta0[i], theta1[j])).T
            jvals[i, j] = costFunc(theta, x, y)
    x, y = np.meshgrid(theta0, theta1)
    ax.scatter(res[0], res[1])#梯度下降法所得到的θ值得散点图,即中心点
    # transpose jvals before calling contour, or else the axes will be flipped
    ax.contour(x, y, jvals.T, np.logspace(-2, 2, 50))
    ax.set_title('Contour of Cost Function')

线性回归——练习题