吴恩达机器学习笔记_Course1

第一课 第二周笔记:多元回归

仅做个人记录所用

多元线性回归

第二周第一部分课程主要介绍了多元特征以及向量化相关内容,最后一个课程中介绍了“用于多元线性回归的梯度下降”。本节主要有以下几个知识点需要掌握

多元线性回归

多元线形回归是上周提到的单变量线形回归的推广。 比如说影响房价的不但有房屋面积,还有卧室数量等等。这些都可以导入到多变量回归模型中。
来源视频截图

向量化

主要掌握点积这一知识点即可,多维数组的概念十分好理解。
来源视频截图

多元线形回归的梯度下降

多变量线形回归的梯度下降的公式与单变量的一致,不同点在于当有多个变量的时候在更新参数时需要同步更新。
来源课程实验室截图
另外有若干知识点放于下截图中
来源课程实验室截图
上图主要介绍各个符号在代码中的对应意思,其中X(i) 代表第几个训练样本,x1 指代第几个变量,记得保持区分。
成本函数计算公式
w,b梯度下降公式

#本节课程实验室代码
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次方来构造出一个多项式方程,我们便能得到抛物线。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值