第一课 第二周笔记:多元回归
仅做个人记录所用
多元线性回归
第二周第一部分课程主要介绍了多元特征以及向量化相关内容,最后一个课程中介绍了“用于多元线性回归的梯度下降”。本节主要有以下几个知识点需要掌握
多元线性回归
多元线形回归是上周提到的单变量线形回归的推广。 比如说影响房价的不但有房屋面积,还有卧室数量等等。这些都可以导入到多变量回归模型中。
向量化
主要掌握点积这一知识点即可,多维数组的概念十分好理解。
多元线形回归的梯度下降
多变量线形回归的梯度下降的公式与单变量的一致,不同点在于当有多个变量的时候在更新参数时需要同步更新。
另外有若干知识点放于下截图中
上图主要介绍各个符号在代码中的对应意思,其中X(i) 代表第几个训练样本,x1 指代第几个变量,记得保持区分。
#本节课程实验室代码
import copy, math
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('./deeplearning.mplstyle') #此处是引用存储在另外一处的程序,由课程提供,用于确定图标格式
np.set_printoptions(precision=2) # reduced display precision on numpy arrays
#dataset
X_train = np.array([[2104, 5, 1, 45], [1416, 3, 2, 40], [852, 2, 1, 35]])
y_train = np.array([460, 232, 178])
# data is stored in numpy array/matrix
print(f"X Shape: {X_train.shape}, X Type:{type(X_train)})")
print(X_train)
print(f"y Shape: {y_train.shape}, y Type:{type(y_train)})")
print(y_train)
#w,b初始值
b_init = 785.1811367994083
w_init = np.array([ 0.39133535, 18.75376741, -53.36032453, -26.42131618])
print(f"w_init shape: {w_init.shape}, b_init type: {type(b_init)}")
#计算成本函数,为后续梯度计算做准备
def compute_cost(X, y, w, b):
"""
compute cost
Args:
X (ndarray (m,n)): Data, m examples with n features
y (ndarray (m,)) : target values
w (ndarray (n,)) : model parameters
b (scalar) : model parameter
Returns:
cost (scalar): cost
"""
m = X.shape[0]
cost = 0.0
for i in range(m):
f_wb_i = np.dot(X[i], w) + b #(n,)(n,) = scalar (see np.dot)
cost = cost + (f_wb_i - y[i])**2 #scalar
cost = cost / (2 * m) #scalar
return cost
#计算梯度,计算dj_dw与dj_db,味后续批量梯度下降做准备
def compute_gradient(X, y, w, b):
"""
Computes the gradient for linear regression
Args:
X (ndarray (m,n)): Data, m examples with n features
y (ndarray (m,)) : target values
w (ndarray (n,)) : model parameters
b (scalar) : model parameter
Returns:
dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w.
dj_db (scalar): The gradient of the cost w.r.t. the parameter b.
"""
m,n = X.shape #(number of examples, number of features)
dj_dw = np.zeros((n,))
dj_db = 0.
for i in range(m):
err = (np.dot(X[i], w) + b) - y[i]
for j in range(n):
dj_dw[j] = dj_dw[j] + err * X[i, j]
dj_db = dj_db + err
dj_dw = dj_dw / m
dj_db = dj_db / m
return dj_db, dj_dw
#对于如何确定迭代后收敛,一般都是先迭代1000次再说
def gradient_descent(X, y, w_in, b_in, cost_function, gradient_function, alpha, num_iters):
"""
Performs batch gradient descent to learn w and b. Updates w and b by taking
num_iters gradient steps with learning rate alpha
Args:
X (ndarray (m,n)) : Data, m examples with n features
y (ndarray (m,)) : target values
w_in (ndarray (n,)) : initial model parameters
b_in (scalar) : initial model parameter
cost_function : function to compute cost
gradient_function : function to compute the gradient
alpha (float) : Learning rate
num_iters (int) : number of iterations to run gradient descent
Returns:
w (ndarray (n,)) : Updated values of parameters
b (scalar) : Updated value of parameter
"""
# An array to store cost J and w's at each iteration primarily for graphing later
J_history = []
w = copy.deepcopy(w_in) #avoid modifying global w within function
b = b_in
for i in range(num_iters):
# Calculate the gradient and update the parameters
dj_db,dj_dw = gradient_function(X, y, w, b) ##None
# Update Parameters using w, b, alpha and gradient
w = w - alpha * dj_dw ##None
b = b - alpha * dj_db ##None
# Save cost J at each iteration
if i<100000: # prevent resource exhaustion
J_history.append( cost_function(X, y, w, b))
# Print cost every at intervals 10 times or as many iterations if < 10
if i% math.ceil(num_iters / 10) == 0:
print(f"Iteration {i:4d}: Cost {J_history[-1]:8.2f} ")
return w, b, J_history #return final w,b and J history for graphing
# initialize parameters
initial_w = np.zeros_like(w_init)
initial_b = 0.
# some gradient descent settings
iterations = 1000
alpha = 5.0e-7
# run gradient descent
w_final, b_final, J_hist = gradient_descent(X_train, y_train, initial_w, initial_b,
compute_cost, compute_gradient,
alpha, iterations)
print(f"b,w found by gradient descent: {b_final:0.2f},{w_final} ")
m,_ = X_train.shape
for i in range(m):
print(f"prediction: {np.dot(X_train[i], w_final) + b_final:0.2f}, target value: {y_train[i]}")
梯度下降的实现
本节包含6个视频,3个实验室,主要介绍了一下几个知识点。
特征缩放
当有多个变量的时候,我们需要通过特征缩放保证特征都有相同尺度,这样更容易找到最好的模型。
比如说有卧室数和房屋大小两个特征,如果不缩放,那么损失函数的等高线图就会十分扁。这样在更新参数的时候就极容易在数字小的那个参数上走过头。
但是如果我们把两个特征量都缩放到0-1的值的话,损失函数的等高线图就会趋向于圆形,从而防止横跳。
梯度下降收敛的检查
主要是看cost的曲线图
选择合适的学习率
特征工程
特征工程就是通过组合特征来创造新的特征。
比方说要预测土地价格,我们有土地纵深和宽度两个特征。这时如果我们把纵深乘以宽度的话就可以得到第三个特征「面积」。
多项式回归
多项式回归可以解决非线性的问题。
如果数据分布明显呈一条抛物线。如果我们如果用线性回归的话只能得到直线。但是如果我们加入几个x的n次方来构造出一个多项式方程,我们便能得到抛物线。