本文包含了机器学习中线性回归的几个基本函数的实现,代码中标有明确的注释,可以直接享用,畅通无阻

1.单(多)特征成本函数的计算

# 单特征的成本函数
def singe_computer_cost(x,y,w,b):
    m = x.shape[0]
    total_cost = 0
    for i in range(m):
        total_cost += (w * x[i] - y[i])**2
    total_cost =total_cost / (2*m)
    return total_cost

# 多特征的成本函数
def multiply_computer_cost(x,y,w,b):
    m = x.shape[0]
    total_cost = 0
    for i in range(m):
        f_wb_i = np.dot(w,x[i]) + b
        total_cost += (f_wb_i - y[i])**2
    total_cost =total_cost / (2*m)
    return total_cost

2.单(多)特征梯度下降函数的计算

# 单特征梯度下降函数偏导函数
def computer_gradient(x,y,w,b):
    m = x.shape[0]
    dj_dw = 0
    dj_db = 0

    for i in range(m):
        f_wb = w * x[i] + b
        dj_dw += (f_wb - y[i])*x[i]
        dj_db += f_wb - y[i]

    dj_dw = dj_dw / m
    dj_db = dj_db / m
    return dj_dw, dj_db

# 多特征梯度下降函数偏导函数
# 变化的只有dj_dw,从值变为了一维向量
# 需要计算每个dj_dw[i]的值,而在计算过程中,err始终是当前i所指数据和实际值之间的误差
def multiply_computer_gradient(x,y,w,b):
    m = x.shape[0]
    dj_dw = np.zeros(m)
    dj_db = 0
    for i in range(m):# i指数据,j指某个数据中的具体特征
        f_wb = np.dot(x[i],w) + b
        err = f_wb - y[i] # err始终是当前i所指数据和实际值之间的误差
        for j in range(m):
            dj_dw[j] += err * x[i,j] # 这里对应计算每个特征对应的偏导数,x[i,j]表示第i个数据的第j个特征
        dj_db += err # dj_db的计算和之前一样
    dj_dw = dj_dw / m
    dj_db = dj_db / m
    return dj_dw, dj_db

3.梯度下降函数w,b的更新记录与输出实现

# 计算梯度下降的更新值,单特征和多特征都是一样,变得只是输入的w的形状
# 由于numpy数组可以同一班算术那样进行计算,所有不管是数组还是值,都可以用w = w - alpha * dj_dw来计算更新的w
# 计算的结果是w数组中的每一项各自的新值
def gradient_descent(alpha,x,y,w_in,b_in,cost_function,gradient_function,num_items):
    J_history = []
    w_history = []
    w = copy.deepcopy(w_in)
    b = b_in
    for i in range(num_items):
        dj_dw, dj_db = gradient_function(x,y,w,b)
        w = w - alpha * dj_dw
        b = b - alpha * dj_db
        J_history.append(cost_function(x,y,w,b))
        if i % math.ceil(num_items / 10) == 0:
            w_history.append(w)
            print(f"Iteration {i:4}: Cost {float(J_history[-1]):8.2f}   ")
    return w,b,w_history, J_history
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐