环境
- 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()
通过以上代码,绘制散点图如下所示:
代价函数的实现
代价函数的数学表达式如下所示(参考单变量线性回归):
我们已经为线性回归数据集设置了数据,以下几行代码中,数据集中X再增加一维用来容纳参数,并将其初始化为0,同时设置学习率
为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矩阵应该为(训练样本的个数)
2 维矩阵, 本次X矩阵为97
2规模,根据矩阵计算原则,最后计算结果应该如下图所示:
注意:以上代码实现的是矩阵计算,不能简单地使用
X*theta
,而是使用np.dot(X,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次,学习率为0.01,代价函数的值越来越小,逐渐收敛,如下图所示,打印出代价函数
的值,发现其值不断减小,符合我们的期望。
通过梯度下降算法,我们也能较为准确的得到参数,
的值,如下所示:
显然,通过算法实现,我们得到了较为合适的和
的值,用以拟合数据,最后,通过以下代码用以实现单变量线性回归方程的曲线。
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包的相关运算。
网友评论