1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Linear Regression 吴恩达机器学习实验一(线性回归)

Linear Regression 吴恩达机器学习实验一(线性回归)

时间:2019-09-06 11:20:42

相关推荐

Linear Regression 吴恩达机器学习实验一(线性回归)

Linear Regression with one variable

实验要求

"""在这部分练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐厅特许经营公司的首席执行官,正在考虑在不同的城市开设新的分店。该连锁店已经在各个城市拥有卡车,您可以从这些城市获得利润和人口数据。您希望使用此数据来帮助您选择下一个要扩展到的城市。文件ex1data1.txt包含线性回归问题的数据集。第一列是一个城市的人口,第二列是该城市食品卡车的利润。利润为负值表示亏损。"""

代码部分如下

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt

加载数据集

data = pd.read_csv('ex1data1.txt',names = ['Population','Profit']) # names参数传递列表,将名字命名在对应列上data_x = np.array(data['Population']) # 将数据名为x的列提取data_y = np.array(data['Profit']) # 同上data.head() # 是指取数据的前n行数据,默认是前5行。

打印了前五行数据

看看数据分布

data.describe() # count数据量 mean均值 std标准差 min最小值 max最大值

绘图观察数据在坐标上的分布。

目标:利用梯度下降,使代价函数代价最小化,从而使假设函数更好地拟合数据,完成线性回归从而作出新的预测。

下面是代价函数:

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}}} J(θ)=2m1​i=1∑m​(hθ​(x(i))−y(i))2

# 代价函数def computeCost(X,y,theta):inner = np.dot(X,theta.T)result = np.sum(np.power(inner - y,2))return result/( 2 * len(X))

让我们在训练集中添加一列,保存theta0的占位符。

以便我们可以使用向量化的解决方案来计算代价和梯度。

在第0个列上建造一个新列’ones’,插入值1,方便后面计算时theta0的x系数为1.

因为:

h ( x ) = θ 0 + θ 1 x h(x) = \theta_0 + \theta_1 x h(x)=θ0​+θ1​x

以下两式由梯度下降和代价函数求偏导数后求出。

θ 0 : = θ 0 − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) {\theta_{0}}:={\theta_{0}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{ \left({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)} θ0​:=θ0​−am1​i=1∑m​(hθ​(x(i))−y(i))

θ 1 : = θ 1 − a 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x ( i ) ) {\theta_{1}}:={\theta_{1}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)\cdot {{x}^{(i)}} \right)} θ1​:=θ1​−am1​i=1∑m​((hθ​(x(i))−y(i))⋅x(i))

所以:

data.insert(0,'Ones',1) data.head()

# 建立训练数据集X 和 目标变量ycols = data.shape[1]X = data.iloc[:,0:cols-1] # 因为提取是左闭右开原则[0,2)故将ones和人口给Xy = data.iloc[:,cols-1:cols] # 原理同上,必须打上开区间才行,否则维度不正确

这里可以用X.shape 和 y.shape检验一下维度。

这里初始化参数值, θ 0 θ 1 \theta_0 \theta_1 θ0​θ1​ 的初值都是0.

# 初始化数据theta = np.matrix(np.array([0,0]))X = np.matrix(X)y = np.matrix(y)

下面设置梯度下降算法:

这里的原理就是通过不断的迭代,通过误差来不断修改 θ \theta θ参数的值,并且每一次迭代,都要保证代价cost的下降。直到cost最小(收敛)。最后的参数刚好可以使线性函数最好地拟合数据。

# 单变量梯度下降def gradientDescent(X,y,theta,alpha,iters):temp = np.matrix(np.zeros(theta.shape)) # 创建一个和theta相同大小的临时变量矩阵parameters = int(theta.ravel().shape[1])cost = np.zeros(iters)for i in range(iters):error = (X * theta.T) - y # 建模误差for j in range(parameters):term = np.multiply(error , X[:,j]) # 建模误差与x样本对应相乘temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))# 矩阵访问下标theta = tempcost[i] = computeCost(X,y,theta)return theta , cost

对应公式:(1)先求偏导数:

∂ ∂ θ j J ( θ 0 , θ 1 ) = ∂ ∂ θ j 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 \frac{\partial }{\partial {{\theta }_{j}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{\partial }{\partial {{\theta }_{j}}}\frac{1}{2m}{{\sum\limits_{i=1}^{m}{\left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)}}^{2}} ∂θj​∂​J(θ0​,θ1​)=∂θj​∂​2m1​i=1∑m​(hθ​(x(i))−y(i))2

j = 0 j=0 j=0 时: ∂ ∂ θ 0 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \frac{\partial }{\partial {{\theta }_{0}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{1}{m}{{\sum\limits_{i=1}^{m}{\left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)}}} ∂θ0​∂​J(θ0​,θ1​)=m1​i=1∑m​(hθ​(x(i))−y(i))

j = 1 j=1 j=1 时: ∂ ∂ θ 1 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x ( i ) ) \frac{\partial }{\partial {{\theta }_{1}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)\cdot {{x}^{(i)}} \right)} ∂θ1​∂​J(θ0​,θ1​)=m1​i=1∑m​((hθ​(x(i))−y(i))⋅x(i))

(2)接下来对应公式

Repeat {

​ θ 0 : = θ 0 − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) {\theta_{0}}:={\theta_{0}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{ \left({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)} θ0​:=θ0​−am1​i=1∑m​(hθ​(x(i))−y(i))

​ θ 1 : = θ 1 − a 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x ( i ) ) {\theta_{1}}:={\theta_{1}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)\cdot {{x}^{(i)}} \right)} θ1​:=θ1​−am1​i=1∑m​((hθ​(x(i))−y(i))⋅x(i))

}

error 对应:

h θ ( x ( i ) ) − y ( i ) = θ 0 + θ 1 x − y ( i ) h_\theta(x^{(i)}) - y^{(i)} = \theta_0 + \theta_1x - y^{(i)} hθ​(x(i))−y(i)=θ0​+θ1​x−y(i)

term对应:

​ θ : = θ − a 1 m ∑ i = 1 m ( ( e r r o r ) ⋅ x ( i ) ) {\theta}:={\theta}-a\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left(\mathrm{error} \right)\cdot {{x}^{(i)}} \right)} θ:=θ−am1​i=1∑m​((error)⋅x(i))

temp[0,j]应该对应上面公式很容易看出。这是一个更新临时变量的过程,这可以保证参数同时更新

这里注意temp的类型是matrix类型,[0,j]表示访问矩阵的第0行第j列元素。

将代价存放在数组里方便后续运算和画图。

# 初始化参数alpha = 0.01iters = 1000

绘制图片:

x = np.linspace(data.Population.min(), data.Population.max(), 100)f = g[0, 0] + (g[0, 1] * x) # 假设函数fig, ax = plt.subplots(figsize=(12,8)) # 建立一个图ax.plot(x, f, 'r', label='Prediction')ax.scatter(data.Population, data.Profit, marker = 'x', label='Traning Data')ax.legend(loc=2)ax.set_xlabel('Population')ax.set_ylabel('Profit')ax.set_title('Predicted Profit vs. Population Size')plt.show()

绘制cost图像观察收敛情况。

fig, ax = plt.subplots(figsize=(12,8))ax.plot(np.arange(iters), cost, 'r')ax.set_xlabel('Iterations')ax.set_ylabel('Cost')ax.set_title('Error vs. Training Epoch')plt.show()

参考链接:

/weixin_40212554/article/details/89437146

/people/fengdu78

Linear Regression with Multivariable

"""在这一部分中,您将使用多个变量实现线性回归,以预测房价。假设你正在卖房子,你想知道好的市场价格是多少。这样做的一个方法是首先收集近期售出房屋的信息,并制作房价模型。ex1data2.txt文件包含俄勒冈州波特兰市房价的训练集。第一列是房子的大小(平方英尺),第二列是卧室的数量,第三列是房子价格。"""

data2 = pd.read_csv('ex1data2.txt',names = ['Size','Bedrooms','Price']) # names参数传递列表,将名字命名在对应列上data2.head() # 是指取数据的前n行数据,默认是前5行。

要进行数据预处理,这是实验要求:

# 因为样本数据范围大且分布不一致,所以使用特征归一化。# 这部分是实验要求的:#通过查看这些值,请注意房屋大小大约是卧室数量的1000倍。#当特征相差几个数量级时,首先执行特征缩放可以使梯度下降收敛得更快data2 = (data2 - data2.mean()) / data2.std()data2.head()

# add ones columndata2.insert(0, 'Ones', 1)# set X (training data) and y (target variable)cols = data2.shape[1]X2 = data2.iloc[:,0:cols-1]y2 = data2.iloc[:,cols-1:cols]# convert to matrices and initialize thetaX2 = np.matrix(X2.values)y2 = np.matrix(y2.values)theta2 = np.matrix(np.array([0,0,0]))# perform linear regression on the data setg2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)# get the cost (error) of the modelcomputeCost(X2, y2, g2)fig, ax = plt.subplots(figsize=(12,8))ax.plot(np.arange(iters), cost2, 'r')ax.set_xlabel('Iterations')ax.set_ylabel('Cost')ax.set_title('Error vs. Training Epoch')plt.show()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。