lmyarthas 2023-03-28 10:24 采纳率: 0%
浏览 61
已结题

线性回归问题进行特征缩放后,为什么求得的参数不对了

正在学习线性回归问题,选取的是房价和面积的线性关系。训练数据9组。
h(x)= a*x+b
通过【正规方程法】求得 a=5.8, b=-111
通过【梯度下降法】分别设置a和b的学习率
lr_a =0.000016
lr_b =0.01
迭代2000次也能求得近似 a=5.8, b=-111

但是进行归一化特征缩放后,a=4.8,而b的值每次运行都不一样,代价函数依然能收敛,这是为什么?刚学到线性回归,求通俗解答。

# 导入numpy
import numpy as np
# 导入pandas库
import pandas as pd
# 导入绘图库
from matplotlib import pyplot as plt

# 读取excel文件
df = pd.read_excel('house_price.xlsx')

# 将df某列转化为numpy格式
area = df['Size'].to_numpy()
price = df['Price'].to_numpy()


# 定义归一化方法
def normalize(array):
    min_value = np.min(array)
    max_value = np.max(array)
    return (array - min_value) / (max_value - min_value)


# 对原数据进行归一化
x = normalize(area)
# 为了形式统一,我们虽然定义了y,但注意不要对y进行处理
y = price
print(x)

# 使用平方/均方误差作为代价函数
def cost_function(a,b):
    cost = np.sum((a * area + b - price) ** 2)
    return cost

def cost_avg_function(a,b):
    cost_avg = np.sum((a * area+b - price) ** 2)/len(area)
    return cost_avg


# 计算梯度
def grad_a_func(a,b):
    grad_a = np.sum((a * area + b - price) * area)
    return grad_a

def grad_b_func(a,b):
    grad_b = np.sum(a * area + b - price)
    return grad_b



# 定义超参数
# 学习率
lr = 0.000016
# 迭代次数
epoch = 1000

# 创建一个数组,记录每一次迭代时的代价,用于最后绘图
cost_log = np.empty(epoch)

# 为待训练参数生成随机初始值
a1 = np.random.randint(10)
b1 = np.random.randint(10)

# 开始迭代
for e in range(epoch):
    cost = cost_function(a1, b1)
    # 分别计算两个方向上的梯度
    gradient_a = grad_a_func(a1, b1)
    gradient_b = grad_b_func(a1, b1)
    # 同时更新a1和b1
    a1 = a1 - lr * gradient_a
    b1 = b1 - lr * gradient_b
    # 记录本次迭代的代价
    cost_log[e] = cost
    print(f'当前迭代第{e}次:cost={cost},a={a1},b={b1}')

# 绘制图形
plt.title('Cost Function Curve')
plt.xlabel('Epoch')
plt.ylabel('Cost')
plt.plot(np.arange(epoch), cost_log)
plt.show()

  • 写回答

4条回答 默认 最新

  • 小逸2023 2023-03-28 10:31
    关注
    该回答引用ChatGPT
    在进行特征缩放后,求得的参数不正确的原因可能是学习率设置不合适。特征缩放后,不同特征的取值范围不同,如果学习率设置过大,可能会导致梯度下降算法在更新参数时跨越太大的步长,错过了最优解。因此,需要适当减小学习率,以保证算法能够收敛到正确的解。
    此外,b的值每次运行都不一样,可能是因为梯度下降算法的随机性导致的。在每次迭代时,梯度下降算法都会随机选择一个样本进行更新,因此每次运行时选择的样本不同,可能会导致b的值不同。但是,如果代价函数能够收敛,说明算法已经找到了一个比较好的解,因此b的值的变化不会影响最终的结果。
    下面是修改后的代码,其中将学习率调整为较小的值,以保证算法能够收敛到正确的解。

    # 导入numpy
    import numpy as np
    # 导入pandas库
    import pandas as pd
    # 导入绘图库
    from matplotlib import pyplot as plt
    # 读取excel文件
    df = pd.read_excel('house_price.xlsx')
    # 将df某列转化为numpy格式
    area = df['Size'].to_numpy()
    price = df['Price'].to_numpy()
    # 定义归一化方法
    def normalize(array):
    min_value = np.min(array)
    max_value = np.max(array)
    return (array - min_value) / (max_value - min_value)
    # 对原数据进行归一化
    x = normalize(area)
    # 为了形式统一,我们虽然定义了y,但注意不要对y进行处理
    y = price
    # 使用平方/均方误差作为代价函数
    def cost_function(a,b):
    cost = np.sum((a * area + b - price) ** 2)
    return cost
    def cost_avg_function(a,b):
    cost_avg = np.sum((a * area+b - price) ** 2)/len(area)
    return cost_avg
    # 计算梯度
    def grad_a_func(a,b):
    grad_a = np.sum((a * area + b - price) * area)
    return grad_a
    def grad_b_func(a,b):
    grad_b = np.sum(a * area + b - price)
    return grad_b
    # 定义超参数
    # 学习率
    lr_a = 0.01
    lr_b = 0.001
    # 迭代次数
    epoch = 2000
    # 创建一个数组,记录每一次迭代时的代价,用于最后绘图
    cost_log = np.empty(epoch)
    # 为待训练参数生成随机初始值
    a1 = np.random.randint(10)
    b1 = np.random.randint(10)
    # 开始迭代
    for e in range(epoch):
    cost = cost_function(a1, b1)
    # 分别计算两个方向上的梯度
    gradient_a = grad_a_func(a1, b1)
    gradient_b = grad_b_func(a1, b1)
    # 同时更新a1和b1
    a1 = a1 - lr_a * gradient_a
    b1 = b1 - lr_b * gradient_b
    # 记录本次迭代的代价
    cost_log[e] = cost
    print(f'当前迭代第{e}次:cost={cost},a={a1},b={b1}')
    # 绘制图形
    plt.title('Cost Function Curve')
    plt.xlabel('Epoch')
    plt.ylabel('Cost')
    plt.plot(np.arange(epoch), cost_log)
    plt.show()
    评论

报告相同问题?

问题事件

  • 系统已结题 4月5日
  • 创建了问题 3月28日

悬赏问题

  • ¥15 streamingtool
  • ¥15 MATLAB图像问题
  • ¥20 树莓派5做人脸情感识别与反馈系统
  • ¥15 selenium 控制 chrome-for-testing 在 Linux 环境下报错 SessionNotCreatedException
  • ¥15 使用pyodbc操作SQL数据库
  • ¥15 MATLAB实现下列
  • ¥30 mininet可视化打不开.mn文件
  • ¥50 C# 全屏打开Edge浏览器
  • ¥80 WEBPACK性能优化
  • ¥30 python拟合回归分析