weixin_51171409 2024-09-19 21:44 采纳率: 0%
浏览 3

(标签-线性回归|关键词-梯度下降)

各位,帮忙看看这个基于批量梯度下降的线性回归哪里有问题?
为什么我的损失函数会越来越大啊


import numpy as np
import pandas as pd
from sklearn import datasets
from  sklearn.model_selection import  KFold
folder=KFold(n_splits=10,shuffle=True,random_state=50)
#from sklearn.preprocessing import MinMaxScaler
#scaler = MinMaxScaler( )

def target_fuc(theta,X,Y):
    predict = np.dot(X,theta)
    metric1 = predict - Y.reshape(Y.shape[0],1)
    j_theta = 0.5*np.dot(metric1.T,metric1)[0][0]
    return j_theta

def batch_gredient_descent(theta,alpha,dataset,target,epsilon,m,max_literation):
    error0 = 0  # 记录前一个损失函数
        #print('theta{}正在处理'.format(j))
    for i in range(max_literation):
        print('第{}次迭代'.format(i))
        delta = np.dot(dataset, theta).reshape(m, 1) - target.reshape(m, 1)  # 预测值和真实值的差
        deri = alpha * np.dot(delta.T,dataset)
        theta = theta - deri.T
        error1 = target_fuc(theta=theta,X=dataset,Y=target)
        print(error1)
        if abs(error1-error0)<=epsilon:
            break
        else:
            error0 = error1
    return theta

boston = datasets.load_boston()
data = pd.DataFrame(boston.data, columns=boston.feature_names)
feature = data.columns.tolist()
data = np.array(data)
#scaler.fit(data)
#data=scaler.transform(data)

m,n = data.shape #m个训练样本,n维特征
I = np.vstack(np.ones((m, 1)))
data = np.hstack((I, data))
y = boston.target
print(data.shape)

for train_index,test_index in folder.split(data):
    x_train = data[train_index, :].astype('float64')
    x_test= data[test_index, :].astype('float64')
    y_train = y[train_index].astype('float64')
    y_test = y[test_index].astype('float64')
    theta = np.array([0] * (n+1)).reshape(n+1,1)
    final_theta = batch_gredient_descent(theta=theta,alpha=0.01,dataset=x_train,target=y_train,epsilon=1e-6 ,m=x_train.shape[0],max_literation=1000)

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-19 21:45
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    首先,从你给出的代码来看,你的代码是基于批量梯度下降算法的线性回归模型。下面是我对代码的一些观察和建议:

    1. 计算损失函数的问题: 在你的 target_fuc 函数中,你计算了预测值和真实值之间的差,然后计算了这个差的平方和的一半作为损失函数。你的损失函数定义是正确的。

    2. 梯度下降的问题: 在 batch_gredient_descent 函数中,你的梯度计算看起来也是正确的。你根据损失函数对参数的偏导数来更新参数。

    3. 可能的损失函数增加原因: 如果你的损失函数在训练过程中增加,可能是由于以下几个原因:

      • 数据标准化: 你没有对特征进行标准化或归一化。当特征的取值范围差异很大时,可能会导致梯度下降过程不稳定。考虑使用标准化或归一化来改善模型的训练过程。
      • 学习率过高或过低: 学习率(alpha)的选择非常重要。如果学习率过高,可能会导致模型在最优解附近震荡,使得损失函数值上升;如果学习率过低,模型可能训练得太慢或陷入局部最优解。你可能需要调整学习率的值。
      • 初始参数选择: 你的初始参数 theta 是随机初始化为零的。在某些情况下,这样的初始化可能不是最佳选择,因为它可能导致模型在训练过程中遇到局部最优解。你可以尝试随机初始化参数或者使用更先进的参数初始化方法。
      • 模型是否过拟合: 如果你的模型过拟合,损失函数可能会在训练集上先减小然后增加。考虑增加正则化项或使用其他技术来避免过拟合。
    4. 其他建议:

      • 在训练过程中添加收敛性检查是有用的,以确保模型确实在收敛。你可以通过比较连续迭代之间的损失函数值的变化来实现这一点。你已经有了这样的检查,这是一个好的实践。
      • 考虑添加一些打印语句或日志记录,以便跟踪训练过程中的进展和任何可能出现的问题。
      • 考虑使用更先进的优化算法,如随机梯度下降(SGD)或其变种,这些算法在某些情况下可能更有效。

    总之,你的代码结构看起来是合理的,但可能需要调整一些参数或考虑一些额外的因素来改善模型的训练效果。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月19日

悬赏问题

  • ¥30 stm32f103c8t6制作万能红外遥控器
  • ¥15 有人会fastcrud写前端页面吗
  • ¥15 如何解除Uniaccess管控
  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?