L1范數與L2范數​


L1范數與L2范數​

​ L1范數與L2范數在機器學習中,是常用的兩個正則項,都可以防止過擬合的現象。L1范數的正則項優化參數具有稀疏特性,可用於特征選擇;L2范數正則項優化的參數較小,具有較好的抗干擾能力

1. 防止過擬合

​ L2正則項優化目標函數時,一般傾向於構造構造較小參數,一般認為,參數值較小的模型相對簡單,能適應不同的數據集,在一定程度上避免過擬合的現象,參數較小,數據偏移帶來的影響也會較小,從而說L2正則項具有較好的抗干擾能力,從而實現防止過擬合的現象。

​ L1正則項也可以防止過擬合現象,主要是利用了L1正則項優化參數的稀疏特性。一個簡單的模型,配置參數越少,復雜度越小,而稀疏化的參數,模型的的很多參數都變為0,達到減少參數的目的,從而實現防止過擬合的現象。

例子1:

​ 假設有數據點10個數據點,分別為:(0, -2), (10, 18), (20, 15), (30, 35), (40, 42), (50, 50), (60, 66), (70, 76), (80, 77), (90, 85),如圖1(見代碼1)。

例子1

圖1 樣例數據點

​ 假設該模型為線性模型,即 \(y=ax+b\) 。通過均方誤差(MSE)的方式,求解參數\(a\)\(b\)的值,設上面的10個點分別表示為 \((x_1,y_1),...,(x_{10},y_{10})\) ,目標函數表示為:

\[\begin{align} L &= \sum\limits_{i = 1}^{10} {{{\left( {{y_i} - \left( {a{x_i} + b} \right)} \right)}^2}} \nonumber\\ &= \left( {Y - AX} \right){\left( {Y - AX} \right)^T} \end{align} \]

其中,\(Y = \left( {{y_1},...,{y_N}} \right) \in {R^{1 \times N}}​\)\(A = \left( {a,b} \right) \in {R^{1 \times 2}}​\)\(X = \left( {\begin{array}{*{20}{c}} {{x_1}}& \cdots &{{x_N}}\\ 1& \cdots &1 \end{array}} \right) \in {R^{1 \times N}}​\)

求解:

\[\frac{{\partial L}}{{\partial A}} = 2\left( {Y{X^T} - AX{X^T}} \right) = 0 \\ A = Y{X^T}{\left( {X{X^T}} \right)^{ - 1}} \\ A = \left( {\begin{array}{*{20}{c}} {0.971}&{{\rm{2}}{\rm{.509}}} \end{array}} \right) \]

(結果見代碼1)。

添加L2正則項,

\[L = \left( {Y - AX} \right){\left( {Y - AX} \right)^T} + {\left\| A \right\|^2} \]

求解得到

\[A = Y{X^T}{\left( {I + X{X^T}} \right)^{ - 1}} \\ A = \left( {\begin{array}{*{20}{c}} {{\rm{0}}{\rm{.985}}}&{{\rm{1}}{\rm{.623}}} \end{array}} \right) \]

(結果見代碼2)。

# 代碼1
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import inv
if __name__ == '__main__':
    x = np.arange(0, 100, 10)
    np.random.seed(2019)
    y = x + np.random.randint(-10, 11, 10)
    data = list(zip(x, y))
    print(data)  
    # [(0, -2), (10, 18), (20, 15), (30, 35), (40, 42), (50, 50), (60, 66), 
    # (70, 76), (80, 77), (90, 85)]
    plt.plot(x, y, '-*')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()
    X = np.vstack((np.array(x), np.ones(len(x))))
    Y = np.array(y)
    A = Y.dot(X.T).dot(inv(X.dot(X.T)))
    print(A)  # [0.97090909 2.50909091]

2. L1正則化的稀疏解釋

首先闡述一下為什么需要稀疏。

假設有樣本\(x \in R^m\), \(X=(x_1,...,x_N)\)\(N\)個樣本,\(x_i\)是列向量,這\(N\)個樣本的類別表示為\(Y=(y_1,...,y_N)\),假設\(m>N\),現有一個線性模型\(Y=\theta X\), \(\theta \in R^m\), 由於\(m>N\),所以$ \theta $ 有無數個解,\(x_i\)\(m\) 維的列向量,可能並不是所有的屬性對構建模型都是有效的,此時需要篩選出一些有用的屬。這里對於無用的屬性,可以使用 $ \theta $ 篩選,在指定位置置零即可,除掉 \(X\) 中無用的屬性,此時可能有 \(m_{new} < N\) 該線性模型可能得到唯一解。但是,如何尋找稀疏的 $ \theta $ 呢?

參考:https://vimsky.com/article/3852.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM