ex1-linearRegression

ex1-linearRegression,第1张

  • 实验目的:

实现线性回归并了解其在数据上的工作原理。

  • 实验内容:

实现线性回归并了解其在数据上的工作原理。

三、实验环境:

  • python 3.6.5
  • sklearn 0.19.1
  • CourseGrading在线实验环境

四、实验内容

     1 实现简单示例函数

在该部分练习中,将通过代码实现返回一个5*5的对角矩阵。输出与如下相同:

import numpy as np

A = np.eye(5)

print(A)

   

2.1 绘制数据

在开始进入练习之前,对数据进行可视化通常很有用。对于该数据集,可以使用散点图进行可视化,因为它只有两个属性(人口、利润)。

# 引入所需要的库文件

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import os

%matplotlib inline

# 数据存储路径

path = 'ex1data1.txt'

# 读入相应的数据文件

data = pd.read_csv(path, header=None,names=['Population','Profit'])

#查看数据的前五条

data.head(5)

Population

Profit

0

6.1101

17.5920

1

5.5277

9.1302

2

8.5186

13.6620

3

7.0032

11.8540

4

5.8598

6.8233

data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))

plt.show()

   

2.2.2 实现

在上一部分的练习中,我们已经将所需要用到的数据加载至变量data中,并为其列分别进行命名。

接下来,我们在数据中添加了一个维度来拟合截距项𝜃0θ0。并将初始参数值设为0,学习率𝛼α设为0.01

#在列索引为0处添加数据列,该列值均为1

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

#获取数据列数

cols = data.shape[1]

#对变量X和y进行初始化,并将其数据类型转换为矩阵

X = data.iloc[:,0:cols-1]

y = data.iloc[:,cols-1:cols]

X = np.matrix(X.values)

y = np.matrix(y.values)

#学习率、迭代次数的初始化

alpha = 0.01

iterations = 1500

2.2.3 计算成本J(θ)

在执行梯度下降最小化成本函数𝐽(𝜃)J(θ)时,通过计算成本来监视收敛状态是有帮助的。

在该部分练习任务中,你需要实现一个计算成本𝐽(𝜃)J(θ)的函数computeCost,用于检查梯度下降实现的收敛性。

其中,Xy不是标量值,而是矩阵,其行代表训练集中的示例。

要点: 完成该函数后,将𝜃θ值初始化为0并进行成本的计算,将得到的成本值打印出来。

如果结果为32.07,则计算通过。

###在这里填入代码###

def computeCost(X, y, w):

    inner = np.power(((X * w) - y), 2)

    return np.sum(inner) / (2 * len(X))

w = np.matrix(np.zeros((2,1)))

computeCost(X, y, w)

2.2.4 梯度下降

接下来,我们将实现梯度下降,给出的代码已经实现了循环结构,你只需要在每次的迭代中提供𝜃θ的更新。

在进行代码实现时,请确保你了解要优化的内容,和正在更新的内容。

请记住,成本𝐽(𝜃)J(θ)为参数-被向量𝜃θ终止,而不是𝑋X𝑦y。也就是说,我们将𝐽(𝜃)J(θ)的值最小化通过改变矢量𝜃θ的值,而不是通过改变𝑋X𝑦y

验证梯度下降是否正常工作的一种好方法是查看𝐽(𝜃)J(θ)的值,并检查该值每步是否减小。每次迭代时,代码都会调用computeCost函数并打印成本。假设你实现了梯度下降,正确地计算成本,𝐽(𝜃)J(θ)值永远不会增加,并且应该在算法结束时收敛到稳定值。

要点:

实现梯度下降后,需要使用最终的参数值将线性回归的拟合结果进行可视化,绘图结果需要类似如下图所示。

###在这里填入代码###

def gradientDescent(X, y, w, alpha, iters):

    temp = np.matrix(np.zeros(w.shape))

    parameters = int(w.ravel().shape[1])

    cost = np.zeros(iters)

    for i in range(iters):

        error = (X * w) - y

        for j in range(parameters):

            term = np.multiply(error, X[:,j])

            temp[j,0] = w[j,0] - ((alpha / len(X)) * np.sum(term))

        w = temp

        cost[i]=computeCost(X,y,w)

    return w, cost

# 计算最终的参数所得到的成本值

w_final, cost_final = gradientDescent(X, y, w, alpha, iterations)

# 计算最终的参数所得到的成本值

print('The weight vector:\n',w_final)

computeCost(X, y, w_final)

###在这里填入代码###

#对拟合曲线进行绘制

x = np.linspace(data.Population.min(), data.Population.max(), 100)

f = w_final[0,0] + (w_final[1,0] * x)

fig, ax = plt.subplots(figsize=(9,6))

ax.plot(x, f, 'b', label='Prediction')

ax.scatter(data.Population, data.Profit, c='red',label='Traning Data')

ax.legend(loc=2)

ax.set_xlabel('Population')

ax.set_ylabel('Profit')

ax.set_title('Predicted Profit vs. Population Size')

2.3 可视化成本函数

为了更好地理解成本函数的迭代计算,将每一步计算的cost值进行记录并绘制。

fig, ax = plt.subplots(figsize=(9,6))

ax.plot(np.arange(iterations), cost_final, 'r')

ax.set_xlabel('Iterations')

ax.set_ylabel('Cost')

3.1 特征标准化

以下代码将从文件ex1data2.txt文件中加载并显示该数据集。

通过观察这些数据,可以发现房屋的大小大约是卧室数量的1000倍。而当不同的特征值之间相差几个数量级时,将特征进行缩放可以使梯度下降收敛得更快。

path = 'ex1data2.txt'

data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])

data2.head()

      Size Bedrooms     Price

0     2104       3     399900

1     1600       3     329900

2     2400       3     369000

3     1416       2     232000

4     3000       4     539900

###在这里填入代码###

data2 = (data2 - data2.mean()) / data2.std()

data2.head()

3.2 梯度下降

在之前的练习中,我们使用单变量线性回归实现了梯度下降的问题。在该部分联系中,唯一的区别是,此时我们的数据变为矩阵𝑋X

假设函数和批次梯度下降的更新规则保持不变,你的任务是代码实现多变量线性回归的成本函数和梯度下降。

要点

  • 确保你的代码中可以支持任何大小的数据,并且数据均已被向量化。
  • 代码实现成本函数和梯度下降后,最终的成本值应大约为0.13。
  • 请依照单变量线性回归练习中要求,绘制成本的变化曲线。

###在这里填入代码###

# 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 theta

X2 = np.matrix(X2.values)

y2 = np.matrix(y2.values)

w2 = np.matrix(np.array([0,0,0]))

# perform linear regression on the data set

w2_final, cost2_final = gradientDescent(X2, y2, w2.T, alpha, iterations)

# perform linear regression on the data set

 

##=============================================================

# get the cost (error) of the model

print('The weight vector:\n',w2_final)

computeCost(X2, y2, w2_final)

fig, ax = plt.subplots(figsize=(9,6))

ax.plot(np.arange(iterations), cost2_final, 'r')

ax.set_xlabel('Iterations')

ax.set_ylabel('Cost')

ax.set_title('Error vs. Iterations')

五、实验结论

实现线性回归并了解其在数据上的工作原理。

六、教师评议

    

成绩或评语:                              指导教师签名:

                                                                      2022 年 3 月 31日

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/733335.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存