项目一任务5附录

这篇博客介绍了如何定义线性回归模型、损失函数和梯度下降算法,并通过实例展示了训练过程。最终,模型参数被用于预测乐高玩具的价格,预测结果显示了模型的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务5附录

一、定义线性回归模型

def h(theta, X):
    #定义模型函数
    return np.dot(X, theta)  # 此时的X为处理后的X

二、定义损失函数

这里依然采用均方误差。

def J(theta, X, Y):
    #定义代价函数,均方误差
    m = len(X)
    return np.sum(np.dot((h(theta,X)-Y).T, (h(theta,X)-Y))/(2 * m))

三、梯度下降更新过程

def bgd(alpha, X, Y, maxloop, epsilon):
    '''定义梯度下降函数'''
    m, n = X.shape
    theta = np.zeros((n,1))  #初始化参数为0
    count = 0 # 记录迭代次数
    converged = False # 是否已收敛的标志
    cost = np.inf # 初始化代价值为无穷大
    costs = [J(theta, X, Y),] # 记录每一次的代价值
    
    thetas = {}  # 记录每一次参数的更新
    for i in range(n):
        thetas[i] = [theta[i,0],]
        
    while count <= maxloop:
        if converged:
            break
        count += 1
        theta = theta - alpha * 1.0 / m * np.dot(X.T, (h(theta, X) - Y))
        #添加到thetas中
        for j in range(n):
            thetas[j].append(theta[j,0])
        # 记录当前参数的函数代价,并存入costs
        cost = J(theta, X, Y)
        costs.append(cost)     
        if abs(costs[-1] - costs[-2]) < epsilon:
            converged = True
    #print(theta)
    return theta, thetas, costs

四、开始训练

 调用上述数据标准化函数,设置训练过程中的学习率、最大迭代次数、误差阈值,开始训练,然后输出模型参数。

Y =np.array(lgY).reshape(-1,1)
X, values=standarize(np.array(lgX).copy())

m, n = X.shape
X = np.concatenate((np.ones((m,1)), X), axis=1)   # 将第一列为1的矩阵,与原X相连,m行一维值为1扩充到X
print(X.shape, Y.shape) 
alpha = 0.1 # 学习率
maxloop = 2000 # 最大迭代次数
epsilon = 0.01 # 收敛判断条件
result = bgd(alpha, X, Y, maxloop, epsilon)
theta, costs, thetas = result  # 最优参数保存在theta中,costs保存每次迭代的代价值,thetas保存每次迭代更新的theta值
print('模型参数theta如下:\n',theta)
# 到此,参数学习出来了,模型也就定下来了

运行结果:

(63, 5) (63, 1)
模型参数theta如下:
 [[685.39761904]
 [-59.66223869]
 [-36.71790432]
 [ -5.6123785 ]
 [350.28414739]]

五、模型预测

使用线性回归模型,对任意特征的乐高玩具进行价格预测。

#实例预测,比如乐高年限、套装数量、是否全新、原价是(2009、3200、0、250),预测售价
lg_year=2009
lg_num=3100
lg_new=0
lg_oricost=250.0
normalized1 = (lg_year-values[0][0])/values[0][1]
normalized2 = (lg_num-values[1][0])/values[1][1]
normalized3 = (lg_new-values[2][0])/values[2][1]
normalized4 = (lg_oricost-values[3][0])/values[3][1]
predicateX = np.matrix([[1, normalized1,normalized2,normalized3,normalized4]])
print('2009年的乐高、套装数量3200、非全新、原价是250,预测售价为:',h(theta, predicateX))

运行结果:

2009年的乐高、套装数量3200、非全新、原价是250,预测售价为: [[446.11336434]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值