非对称重加权惩罚最小二乘平滑的基线校正-2

往期内容:非对称重加权惩罚最小二乘平滑的基线校正-1

 参考文章:Baseline correction using asymmetrically reweighted penalized least squares smoothing - Analyst (RSC Publishing)

前言:

基于惩罚最小二乘法的基线校正方法已成功地应用于各种光谱分析中。该方法通过估计基线来迭代地改变权重。如果信号低于先前拟合的基线,则给予大权重。另一方面,当信号高于拟合基线时,不给出权重或给出小权重,因为它可以被假设为峰值的一部分。

然而,由于噪声分布在基线之上以及基线之下,因此希望在任一情况下给予给予相同或相似的权重。为此,文章提出了一种新的加权方案的基础上广义逻辑函数。所提出的方法迭代地估计噪声水平,并相应地调整权重。

非对称重加权惩罚最小二乘算法

对于基线的校正,是转化为公式3的极小问题。通过求偏导数向量并将其设为0,即∂S/∂zT=0,求出估计基线的极小值,如公式4:

非对称重加权惩罚最小二乘平滑的基线校正-2_第1张图片

其中y是原始光谱信号,z是待估计的基线,D是差分矩阵,W是权重向量。式3中的第一项表示对数据的适应度,第二项表示z的平滑度。参数λ调整2项之间的平衡。在ar PLS算法中,选择以下部分平衡但不对称的每次自动估计基线的权重,式3:

非对称重加权惩罚最小二乘平滑的基线校正-2_第2张图片

arPLS算法流程

非对称重加权惩罚最小二乘平滑的基线校正-2_第3张图片

相关优秀博客解读:https://blog.csdn.net/qq_35667901/article/details/105231305

非对称重加权惩罚最小二乘平滑的基线校正-2_第4张图片

Python代码实现

import numpy as np
from scipy.sparse import diags
from scipy.linalg import cho_factor, cho_solve

def baseline(y, lambda_, ratio):
    """
    Baseline correction using penalized least squares method.

    Parameters:
    ----------
    y : ndarray
        一维数组,表示输入的信号。

    lambda_ : float
        控制平滑程度的参数。

    ratio : float
        停止迭代的比率。

    Returns:
    -------
    ndarray
        一维数组,表示基线校正后的信号。

    """
    N = len(y)
    #D = diags([1, -2, 1], [0, 1, 2], (N-2, N)).toarray()
    D = sparse.csc_matrix(np.diff(np.eye(N), 2))
    H = lambda_ * np.dot(D, D.T)
    #print(D.shape)
    w = np.ones(N)
    #print(H.shape)

    while True:
        W = diags(w, 0, (N, N)).toarray()
        C = cho_factor(W + H)
        z = cho_solve(C, w * y)
        d = y - z
        dn = d[d < 0]
        m = np.mean(dn)
        s = np.std(dn)
        wt = 1. / (1 + np.exp(2 * (d - (2 * s - m)) / s))
        if np.linalg.norm(w - wt) / np.linalg.norm(w) < ratio:
            break
        w = wt

    return z

非对称重加权惩罚最小二乘平滑的基线校正-2_第5张图片

你可能感兴趣的:(python,算法,最小二乘法,回归)