美文网首页
单变量线性回归的算法实现

单变量线性回归的算法实现

作者: 此间不留白 | 来源:发表于2019-01-19 17:11 被阅读116次

环境

  • python3.6
  • jupyter-notebook

绘制散点图

在机器学习的算法中,数据可视化是非常重要的,能够有利于我们迅速找到合适的数学模型,而对于单变量线性回归的二维问题,通常用散点图来实现数据可视化。在代码实现之前,首先导入所需要的库。

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

单变量线性回归的问题背景如下:

假设,你是一家餐饮公司的CEO,打算在不同的城市之间开设新的分店,根据已有的城市人口和利润的数据,运用单变量线性回归的方法预测城市人口和所获利润之间的关系。

首先,将已有的数据集加载到变量X和y之间,

print('Plotting Data...')
data = np.loadtxt('ex1data1.txt', delimiter=',', usecols=(0, 1)) 
X = data[:, 0]    #数据集的第一列,代表人口
y = data[:, 1]     #数据集的第二列,代表利润
m = y.size       #训练样本的个数

plt.ion()
plt.figure(0)
plot_data(X, y)   #绘图函数

input('Program paused. Press ENTER to continue')

绘图函数的实现如下所示:

def plot_data(x,y)
  plt.scatter(x,y,marker='*',color='r',s=20)  #绘制散点图
  plt.show()

通过以上代码,绘制散点图如下所示:


散点图

代价函数的实现

代价函数的数学表达式如下所示(参考单变量线性回归):
J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=0}^{m}(h_\theta(x_i)-y_i)^2
我们已经为线性回归数据集设置了数据,以下几行代码中,数据集中X再增加一维用来容纳参数\theta_0,并将其初始化为0,同时设置学习率\alpha为0.01

X = np.c_[np.ones(m), X]  
theta = np.zeros(2)
m = len(y)
inner = np.power(((np.dot(X,theta)) - y), 2)   
cost = np.sum(inner) / ( 2*m)

根据以上处理,X矩阵应该为m(训练样本的个数)*2 维矩阵, 本次X矩阵为97*2规模,根据矩阵计算原则,最后计算结果应该如下图所示:

代价函数计算结果

注意:以上代码实现的是矩阵计算,不能简单地使用X*theta,而是使用np.dot(X,theta)来实现

梯度下降算法的实现

通过以上代码,已经实现了代价函数的计算,正如单变量线性回归的解释一样,通过梯度下降算法,不断迭代以实现代价函数的最小化,找到合适的\theta参数,能够使得回归函数能够拟合所绘散点图尽可能多的数据。
梯度下降算法的代码如下所示:

m = y.size

alpha = 0.01
cost = np.zeros(1500)
for iter in range(1500):
    h = X.dot(theta)
   
    theta = theta - alpha*(1.0/m)*(X.T.dot(h-y))
    cost[iter] = compute_cost(X,y,theta)
print(cost)
theta  
plt.plot(cost)
plt.ylabel('cost')
plt.xlabel('iter')

以上代码中,设置了迭代次数为1500次,学习率\alpha为0.01,代价函数的值越来越小,逐渐收敛,如下图所示,打印出代价函数J(\theta_0,\theta_1)的值,发现其值不断减小,符合我们的期望。

代价函数的可视化

通过梯度下降算法,我们也能较为准确的得到参数\theta_0,\theta_1的值,如下所示:

参数的值

显然,通过算法实现,我们得到了较为合适的\theta_0\theta_1的值,用以拟合数据,最后,通过以下代码用以实现单变量线性回归方程的曲线。

plt.figure(0)
line1, = plt.plot(X[:, 1], np.dot(X, theta), label='Linear Regression')
plt.legend(handles=[line1])
plt.scatter(X[:,1],y, s = 30, c = 'r',marker='*',linewidths=1)

方程曲线与散点图如下所示,显然,通梯度下降算法能够较为合适的拟合尽可能多的数据。


回归曲线

算法运用

通过以上代码,已经为单变量线性回归建立了合适的数学模型,通过以下代码,可以进行一些简单的数据预测

predict1 = np.dot(np.array([1, 3.5]), theta)
print(predict1*10000)

predict1 = np.dot(np.array([1, 7]), theta)
print(predict1*10000)

如下图,可以通过城市人口对利润进行预测,当城市人口分别为35000和70000时,其所获利润如下所示


数据预测

总结

通过以上所有代码,用python实现了单变量线性回归的相关算法,相对而言,该算法较为简单,其核心就是梯度下降算法和代价函数最小化的算法。在该算法的实现过程中,用到了大量线性代数的相关知识,要求对矩阵运算法则要熟练掌握,并且能够用矩阵解决相关数据的模型,尤其是通过矩阵的维数的增减(根据矩阵运算法则,维数增加的部分一般遵循相加为0,相乘为1的原则)和转置等相关运算,使其能够符合实际模型的运算过程和矩阵运算法则。python的矩阵运算,主要通过numpy包实现,要求能够熟练掌握numpy包的相关运算。

相关文章

网友评论

      本文标题:单变量线性回归的算法实现

      本文链接:https://www.haomeiwen.com/subject/fdondqtx.html