赞
踩
学习了挺长时间的机器学习了,还没有实践过,认真地看了作业一的代码,并且做了详细注释,希望对其他新手小白有些帮助。
题目描述:在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。
您希望使用这些数据来帮助您选择将哪个城市扩展为下一个城市。
numpy常用于矢量化的计算,pandas通常用来处理结构化的数据,而matplotlib是用来绘制出直观的图表
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = 'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])# read_csv可以读取文件,path为文件路径,header用指定的行来作为标题,若原无标题且指定标题则设为None,names来添加列名
data.head() #head函数可以读取前五行数据
前五行数据如图:
data.describe()#describe函数可以查看数据的基本情况,包括:count 非空数值,mean 平均值,std标准差,max最大值,min 最小值,(25%,50%,75%)分位数等。
输出如下图:
将数据绘制成散点图
data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))# scatter表示散点图,大小为12*8,单位英尺
plt.show()#输出散点图
计算代价函数
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
在训练集中添加一列,以便我们可以使用向量化的解决方案来计算代价和梯度。(即添加特征x0,且所有样本的特征x0均为1)
data.insert(0, 'Ones', 1)#在数据第0列插入名为Ones的列,且均为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列)
观察下 X (训练集) and y (目标变量)是否正确
X.head()#观察x前五行
y.head()#观察y前五行
代价函数是应该是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
即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
计算代价函数 (theta初始值为0).
computeCost(X, y, theta)#32.072733877455676
批量梯度下降
代码实现
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
初始化学习速率α和迭代次数iters
alpha = 0.01
iters = 1000
现在让我们运行梯度下降算法来将我们的参数θ适合于训练集。
g, cost = gradientDescent(X, y, theta, alpha, iters)
# 计算出最合适的参数θ,matrix([[-3.24140214, 1.1272942 ]])
最后,我们可以使用我们拟合的参数计算训练模型的代价函数(误差)。
computeCost(X, y, g)
# 4.5159555030789118
现在我们来绘制线性模型以及数据,直观地看出它的拟合。
代码实现绘图
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个变量(房子的大小,卧室的数量)和目标(房子的价格)。 我们使用我们已经应用的技术来分析数据集。
path = 'ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])# read_csv可以读取文件,path为文件路径,header用指定的行来作为标题,若原无标题且指定标题则设为None,names来添加列名
data2.head()# 显示前五行数据
数据如图:
对于此任务,我们添加了另一个预处理步骤 - 特征归一化。
特征归一化是指将数据统一映射到[0,1]区间上,数据据归一化后,最优解的寻找过程会变得平缓,更容易正确的收敛到最优。
data2 = (data2 - data2.mean()) / data2.std()
data2.head()
归一化后的数据为
这部分与单变量线性回归的预处理一致
# 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
观察训练过程
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()
我们也可以使用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)
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()
利用正规方程解出向量
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。