• 逻辑回归-为什么模型会更加侧重于学习那些数值比较大的列


    np.random.seed(24)
    
    features,labels = arrayGenReg(w=[1,-1,1])
    
    • 1
    • 2
    • 3

    将第一个特征取值调大100倍

    features[:,:1] = features[:,:1] * 100
    features
    ---
    array([[ 132.92121726,   -0.77003345,    1.        ],
           [ -31.62803596,   -0.99081039,    1.        ],
           [-107.08162556,   -1.43871328,    1.        ],
           ...,
           [ 155.07577972,   -0.35986144,    1.        ],
           [-136.26716091,   -0.61353562,    1.        ],
           [-144.02913135,    0.50439425,    1.        ]])
    
    np.linalg.lstsq(features,labels,rcond=-1)
    ---
    (array([[ 0.00999619],
            [-0.99985281],
            [ 0.99970541]]),
     array([0.09300731]),
     3,
     array([3138.44895283,   31.98889632,   30.9814256 ]))
    
    w = np.array([[0.0,0.0,0.0]]).T
    w,w_rec = w_cal_rec(features,w,labels,lr_gd,lr=0.0001,itera_times=100)
    
    plt.subplots(1,2,figsize=(10,4))
    plt.subplot(121)
    plt.plot(range(len(w_rec)),np.array(w_rec)[:,0])
    plt.subplot(122)
    plt.plot(range(len(w_rec)),np.array(w_rec)[:,1])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    ![[附件/Pasted image 20221202102831.png|500]]

    可以看到第一个特征对应的系数 w 1 w_{1} w1大概在100次迭代后就到到达了解析解,并在附近震荡;但是 w 2 w_{2} w2,显然距离解析解还有很远的距离,但此时模型主要还是在调整特征取值大的 w 1 w_{1} w1

    理性上理解一下,即使 w 1 w_{1} w1只动一小点,评估指标就可以有很大的变化,这要是,但是 w 2 w_{2} w2移动一点,却对评估指标作用不大,因此模型会更加侧重于学习那些数值比较大的列

    plt.plot(np.array(w_rec)[:,0],np.array(w_rec)[:,1],'-')
    
    • 1

    ![[附件/Pasted image 20221202103443.png|400]]

    这是 w 1 , w 2 w_{1},w_{2} w1,w2的坐标变化图,由此图我们可以大概估计,如果能画出等高线图,等高线应该是一个椭圆形,长轴和 y y y轴也就是 w 2 w_{2} w2平行,且长轴远远长于短轴,这就导致初始的 w w w取值在非长轴的任意位置,其梯度向量都是近乎或者完全垂直于长轴的,再加上学习率较大,每次迭代后基本到达对侧的相同位置,下次的梯度向量仍然是近乎或者完全垂直于长轴,几乎没有在 y y y方向移动的分量,这就使得模型会更加侧重于学习那些数值比较大的列

    之所以如此震荡是因为学习率选择的原因,如果调小学习率就可能不会有震荡了

    w = np.array([[0.0,0.0,0.0]]).T
    w,w_rec = w_cal_rec(features,w,labels,lr_gd,lr=0.00001,itera_times=100)
    
    plt.subplots(1,2,figsize=(10,4))
    plt.subplot(121)
    plt.plot(range(len(w_rec)),np.array(w_rec)[:,0])
    plt.subplot(122)
    plt.plot(range(len(w_rec)),np.array(w_rec)[:,1])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ![[附件/Pasted image 20221202104138.png|500]]

    归一化后模型对于每个特征的学习会平均很多

    w = np.array([[0.0,0.0,0.0]]).T
    w,w_rec = w_cal_rec(features,w,labels,lr_gd,lr=0.3,itera_times=500)
    
    plt.subplots(1,2,figsize=(10,4))
    plt.subplot(121)
    plt.plot(range(len(w_rec)),np.array(w_rec)[:,0])
    plt.subplot(122)
    plt.plot(range(len(w_rec)),np.array(w_rec)[:,1])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ![[附件/Pasted image 20221202104443.png|500]]

  • 相关阅读:
    零基础产品经理如何迅速学习Axure原型制作?快速上手攻略!
    数字人直播助力商家降本增效,AI数字人主播成为商家直播新选择
    Linux系统64位AT&T系统调用汇编指令syscall
    UE4 C++:TMap容器
    asterisk dialplan(extension)学习笔记
    【LeetCode】Day128-合并K个升序链表
    Java String.split()方法具有什么功能呢?
    服务器硬件介绍(2)
    【考研数据结构代码题6】构建二叉树及四大遍历(先中后层)
    cadence layout lvs时出现error
  • 原文地址:https://blog.csdn.net/liu20020918zz/article/details/128144312