当前位置:   article > 正文

吴恩达机器学习作业一——线性回归_吴恩达 机器学习 数据 练习 作业

吴恩达 机器学习 数据 练习 作业

学习了挺长时间的机器学习了,还没有实践过,认真地看了作业一的代码,并且做了详细注释,希望对其他新手小白有些帮助。

单变量线性回归

题目描述:在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。
您希望使用这些数据来帮助您选择将哪个城市扩展为下一个城市。

导入数据库

numpy常用于矢量化的计算,pandas通常用来处理结构化的数据,而matplotlib是用来绘制出直观的图表

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
  • 1
  • 2
  • 3
'
运行

查看数据

path =  'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])# read_csv可以读取文件,path为文件路径,header用指定的行来作为标题,若原无标题且指定标题则设为None,names来添加列名
data.head() #head函数可以读取前五行数据
  • 1
  • 2
  • 3

前五行数据如图:
在这里插入图片描述

data.describe()#describe函数可以查看数据的基本情况,包括:count 非空数值,mean 平均值,std标准差,max最大值,min 最小值,(25%,50%,75%)分位数等。
  • 1

输出如下图:
在这里插入图片描述
将数据绘制成散点图

data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))# scatter表示散点图,大小为12*8,单位英尺
plt.show()#输出散点图
  • 1
  • 2

在这里插入图片描述

使用梯度下降算法实现线性回归

在这里插入图片描述
计算代价函数

def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))
  • 1
  • 2
  • 3
'
运行

在训练集中添加一列,以便我们可以使用向量化的解决方案来计算代价和梯度。(即添加特征x0,且所有样本的特征x0均为1)

data.insert(0, 'Ones', 1)#在数据第0列插入名为Ones的列,且均为1
  • 1

现在我们来做一些变量初始化。

# set X (training data) and y (target variable)建立训练集和目标变量
cols = data.shape[1] #shape[1]表示矩阵列数
X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列(0~cols-1列)
y = data.iloc[:,cols-1:cols]#y是所有行,最后一列(cols-1~cols列)
  • 1
  • 2
  • 3
  • 4

观察下 X (训练集) and y (目标变量)是否正确

X.head()#观察x前五行
  • 1

在这里插入图片描述

y.head()#观察y前五行
  • 1

在这里插入图片描述
代价函数是应该是numpy矩阵,所以我们需要转换X和Y,然后才能使用它们。 我们还需要初始化theta。

X = np.matrix(X.values)
y = np.matrix(y.values)# 把X和y都转换成矩阵
theta = np.matrix(np.array([0,0]))#把数组[0,0]转换成1X2矩阵,且初始值为0
  • 1
  • 2
  • 3

即theta=matrix([[0, 0]])
看下维度

X.shape, theta.shape, y.shape
#((97, 2), (1, 2), (97, 1)) x为97*2,y为97*1,theta为1*2
  • 1
  • 2

计算代价函数 (theta初始值为0).

computeCost(X, y, theta)#32.072733877455676
  • 1

批量梯度下降
在这里插入图片描述
代码实现

def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    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])
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
            
        theta = temp
        cost[i] = computeCost(X, y, theta)
        
    return theta, cost
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
'
运行

初始化学习速率α和迭代次数iters

alpha = 0.01
iters = 1000
  • 1
  • 2
'
运行

现在让我们运行梯度下降算法来将我们的参数θ适合于训练集。

g, cost = gradientDescent(X, y, theta, alpha, iters)
# 计算出最合适的参数θ,matrix([[-3.24140214,  1.1272942 ]])
  • 1
  • 2

最后,我们可以使用我们拟合的参数计算训练模型的代价函数(误差)。

computeCost(X, y, g)
# 4.5159555030789118
  • 1
  • 2

现在我们来绘制线性模型以及数据,直观地看出它的拟合。
代码实现绘图

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)) #subplot是将多个图画到一个平面上的工具
ax.plot(x, f, 'r', label='Prediction')# plot是二维线画图函数,绘制Prediction图像
ax.scatter(data.Population, data.Profit, label='Traning Data')# scatter是散点图,绘制Traning Data图像
ax.legend(loc=2)# legend为图例,图例数为2
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

绘图结果
在这里插入图片描述

多变量线性回归

练习1还包括一个房屋价格数据集,其中有2个变量(房子的大小,卧室的数量)和目标(房子的价格)。 我们使用我们已经应用的技术来分析数据集。

查看数据

path =  'ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])# read_csv可以读取文件,path为文件路径,header用指定的行来作为标题,若原无标题且指定标题则设为None,names来添加列名
data2.head()# 显示前五行数据
  • 1
  • 2
  • 3

数据如图:
在这里插入图片描述
对于此任务,我们添加了另一个预处理步骤 - 特征归一化。
特征归一化是指将数据统一映射到[0,1]区间上,数据据归一化后,最优解的寻找过程会变得平缓,更容易正确的收敛到最优。

data2 = (data2 - data2.mean()) / data2.std()
data2.head()
  • 1
  • 2

归一化后的数据为
在这里插入图片描述

预处理

这部分与单变量线性回归的预处理一致

# add ones column
data2.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 theta
X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
theta2 = np.matrix(np.array([0,0,0]))

# perform linear regression on the data set
g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)

# get the cost (error) of the model
computeCost(X2, y2, g2)
# 0.13070336960771892
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

观察训练过程

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法。 我们将scikit-learn的线性回归算法应用于第1部分的数据,并看看它的表现。

from sklearn import linear_model
model = linear_model.LinearRegression()
model.fit(X, y)
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
  • 1
  • 2
  • 3
  • 4

scikit-learn model的预测表现

x = np.array(X[:, 1].A1)
f = model.predict(X).flatten()

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

利用正规方程求解

利用正规方程解出向量

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/807459
推荐阅读
相关标签