Advertisement

Probabilistic PCA: When and Why You Should Use It?

阅读量:

作者:禅与计算机程序设计艺术

1.简介

Probabilistic Principal Component Analysis (PPCA) represents a probabilistic dimensionality reduction technique that has garnered increasing interest within the machine learning community. This method excels in managing high-dimensional datasets that contain missing values. By modeling the joint distribution of observed variables alongside their latent structures, PPCA effectively captures the uncertainty inherent in these parameters through conditional distributions. This paper aims to explore the advantages and disadvantages of employing PPCA in anomaly detection tasks. Additionally, we will illustrate how PPCA can be effectively utilized for anomaly detection in time series data. Finally, we will offer potential applications of PPCA in diverse fields such as signal processing, text analysis, image compression, and bioinformatics, among others.

2.相关背景介绍

(1)数据集的维度过高而导致内存不足的问题

在机器学习领域,处理高维数据是一项常见挑战。这类数据的规模通常达到10^10甚至更高的数量级,直接加载到内存进行处理,可能导致计算机资源过度负担,引发系统崩溃或计算异常。为此,降维技术常被采用,通过将高维数据转换为低维表示,从而有效减少内存占用。在降维过程中,我们通常会舍弃冗余信息,或者通过某种方式使得相似的数据尽量聚集在一起。降维后的低维数据集不仅存储和处理更加高效,还能显著提升后续分析的效率。然而,仅进行降维而不进一步处理,可能会导致信息损失问题严重。例如,对原始数据中的某些变化或异常点的识别,可能会变得异常困难。

(2)缺失值问题

在现实场景中,原始数据往往会出现缺失值。这些缺失值可能导致降维效果受到影响,因为它们代表了数据中丢失的重要信息。为此,数据预处理策略通常包括删除缺失值、填补缺失值以及用替代值替代缺失值等方法。然而,这些处理方法可能会引入新的噪声。值得注意的是,由于缺失值的随机性,即使在相同的数据显示下,运行相同的模型也可能得到不同的结果。因此,在实际应用中,通常需要对数据集进行多次重复试验,以获得较为稳定的分析结果。

(3)异常检测问题

另一个重要机器学习任务主要涉及异常检测(anomaly detection)。该任务的核心目标是识别出异常数据点或异常样本实例。在实际应用中,常用异常检测方法主要包括基于距离的检测方法和基于密度的检测方法。基于距离的方法,如DBSCAN算法,能够有效识别与正常数据点距离显著偏离的异常样本;而基于密度的方法,如Kernel Density Estimation(KDE),则通过评估数据点周围的密度分布来判断异常性。尽管这些方法在某些方面表现出色,但在处理高维数据和存在缺失值的复杂数据集时,却存在各自的局限性。然而,基于距离的方法在处理高维数据和缺失值较多的数据时,计算复杂度会显著增加;而基于密度的方法则面临参数选择困难、优化复杂度高以及输出结果对噪声敏感等问题。

3.基本概念术语说明

(1)正态分布

数学上,正态分布由一对正交的标准化曲线构成,被称为标准正态分布。其中一条曲线向x轴负无穷延伸,另一条则向y轴正无穷延伸。其显著特征是均值为0,方差为1。因此,若X服从N(μ,σ²),则Z=(X−μ)/σ和Y=σZ将遵循标准正态分布。

(2)协方差矩阵和相关系数矩阵

协方差矩阵(Covariance Matrix)是用来表征两个变量之间相关性的矩阵。当变量X和Y之间的相关关系近似服从正态分布时,协方差矩阵必然是正定的。其定义如下:协方差矩阵的元素C_{i,j}代表了变量X_i和X_j之间的协方差值。

协方差矩阵是一个方阵,其中包含n个元素,每个元素代表X的第i个观测值与其协方差与Y的第j个观测值的协方差之比。例如,在X和Y均为随机变量且每个观测值相互独立且服从同分布的情况下,协方差矩阵将简化为单位矩阵I。

该矩阵(Correlation Coefficient Matrix)是一种特殊的协方差矩阵,仅记录了变量间比例关系的变化。换句话说,对于两个变量X和Y,若其协方差矩阵为C,则相关系数矩阵即为C除以各自标准差的乘积。其定义如下:

相关系数矩阵可以被定义为一个方阵,其元素的取值范围在-1到1之间,并且对角线元素全部为1。

(3)累积分布函数(CDF)

累积概率函数(cumulative probability function CDF)是概率学中基于某个随机变量的累积概率模型,其定义为:具体而言,该随机变量取值不大于某值的概率。

CDF用于衡量给定阈值 x 时,随机变量 X 的概率分布达到特定概率水平的可能性。例如,CDF(a)代表了X大于或等于a的概率,而CDF(-a)则代表了X小于或等于a的概率。

(4)马尔科夫链

马尔科夫链(Markov chain)可以定义为一系列随机状态的序列,其中每个状态仅受前一状态的影响,状态转移概率仅依赖于当前状态而不考虑历史信息。其运动轨迹将随机过程的特征转化为时间空间结构,成为研究随机过程的重要工具。马尔科夫链的关键特性是齐次马尔科夫性质,即当前状态仅受前一状态的影响,与整个分布的历史无关。其平稳分布指的是马尔科夫链在平行时间点上的联合分布,即各时刻的均值向量。

(5)广义马尔科夫链

广义马尔科夫链(GMC)是马尔科夫链的一种扩展形式。它不限于仅限于有限状态空间的马尔科夫链,而是允许任意状态空间中的马尔科夫链。与常规马尔科夫链不同,广义马尔科夫链在无穷状态空间中允许状态返回初始状态的现象。在无穷状态空间中,同一状态可能反复出现,从而形成了状态返回的特性。例如,在疾病传播模型中,一个人可能会经历多个状态,每个状态都可能影响病人的生命状态。然而,由于这些模型中没有状态返回初始状态的概念,因此在任何时刻返回初始状态的概率为零。广义马尔科夫链通常被称为循环马尔科夫链(circular Markov chain)。

(6)条件概率分布

条件概率分布模型(Conditional probability distribution model)描述了在已知某个随机变量的条件下,另一个随机变量的概率分布情况。其形式通常表示为P(X|Y),其中X为已知条件下的随机变量,Y为未知条件下的随机变量,且两者处于相同的概率空间。其概率密度函数简记为p(X|Y),其中X和Y的概率空间保持一致。

(7)边缘概率

边缘概率(marginal probability)被定义为在已知所有其他变量的具体取值情况下,某一特定随机变量的概率分布。边缘概率的表示方法通常采用以下符号:P(X=x \mid \text{others})

边缘概率可以看作各个随机变量各自的独立分布的乘积。

(8)后验概率

后验概率(Posterior probability)是在观测数据及其对应的隐藏变量已知的情况下,依据贝叶斯公式推导出的条件概率值。计算后验概率需要综合多个相关概率进行乘积运算,这一过程需要遵循观测、估计、假设检验、最大似然估计、近似求解等步骤。

(9)Fisher信息矩阵

Fisher信息矩阵(Fisher information matrix)是一种度量工具,用于衡量观测数据对模型参数信息量的贡献。它基于已知的观测数据、参数估计值、模型参数和误差协方差矩阵进行计算。该矩阵等于参数估计值的逆矩阵,并且对于某些特定的模型结构,该矩阵不具备可逆性。当特定的观测数据集合被确定时,可以通过梯度下降算法求解模型参数,并基于此推导出参数估计值。一旦模型参数已知,就可以计算出基于该参数的后验概率期望值。

(10)概率潜变量

概率潜变量(probabilistic latent variable)是一种概率模型,基于潜在变量和观测变量的联合分布进行表示。潜在变量是隐藏的,而观测变量决定了潜在变量的取值,这一过程反映了潜在变量在数据生成中的作用。概率潜变量模型中,最常见的形式是伯努利-高斯混合模型。这种模型适用于两类数据的建模,包括二项分布和多元正态分布。

4.核心算法原理和具体操作步骤以及数学公式讲解

(1)概率PCA算法

概率型主成分分析法(Probabilistic Principal Component Analysis, PPCA)是一种以概率分布作为数学基础的降维方法。该算法以协方差矩阵的正定性作为损失函数,通过寻找输入变量的最佳投影方向,同时对投影后的输入变量进行后续分析。通过最小化损失函数,能够实现输入变量的最佳投影方向,并使投影后的变量更具可解释性。其主要优势体现在以下几个方面:首先,该方法通过损失函数的构造,能够更精确地捕捉数据的内在结构;其次,投影方向的确定更加科学,避免了传统PCA中人为因素的干扰;最后,该算法在后续分析的可操作性方面表现突出。

  1. 在维度较高的情况下,协方差矩阵可能会有些许的奇异性,而PCA通常会受到奇异值分解的影响,导致模型效果不好。使用PPCA可以保证降维后的输出满足原始输入的方差,从而保证模型的鲁棒性。
  2. 使用PPCA可以解决因缺少数据造成的协方差矩阵奇异性的问题。在缺失值比较严重的情况,可以采用极大似然估计或EM算法估计协方差矩阵,而不是直接使用方差最大化。
  3. 通过模型参数的可解释性,PPCA可以帮助我们理解数据中的模式。在PPCA中,我们可以把模型参数看作是协方差矩阵的特征值与特征向量,特征值越大,则说明该特征方向的方差越大,特征向量的方向对应于协方差矩阵的特征方向,对应于输入数据的方向。通过这两个参数,我们就可以知道数据的分布和主要结构。
  4. PPCA可以用于分类、聚类、降维、异常检测等领域。在分类任务中,PPCA可以帮助我们找到判别函数,这类似于神经网络的思想,直接利用模型参数进行预测。PPCA还可以用于聚类,找出高斯分布族的边界。在降维任务中,PPCA可以用来找出原始数据的主成分,并且保留一定方差的重要信息。在异常检测任务中,PPCA可以帮助我们找到不符合既定规则的数据点,从而发现异常点。

PPCA算法的具体步骤如下:

首先,对原始数据进行预处理工作,涵盖数据清洗、数据转换以及缺失值补全等步骤。其次,基于数据集的特征,合理确定协方差矩阵的迭代次数,并选择合适的估计方法。接着,通过迭代优化过程确定模型参数,涉及降维后的维度、协方差矩阵的特征值与特征向量、降维后的输入变量均值以及协方差矩阵均值等关键指标。最后,将降维后的输入变量映射至低维空间,并基于降维结果进行后续分析。

(1)(1)协方差矩阵的估计方法

估计协方差矩阵的方法有两种:第一种方法是精确解,通过直接计算样本协方差矩阵来实现;第二种方法是近似解,通过极大似然估计或EM算法来计算样本协方差矩阵。

1)精确解

在分析数据的精确解时,我们采用直接计算的方式,具体而言,是通过样本协方差矩阵来计算协方差矩阵。在PPCA的Python实现中,这种方法被采用。在这一方法中,原始数据通常被假设为服从高斯白噪声模型,因此协方差矩阵呈现对角阵结构。然而,当数据服从非高斯白噪声分布时,精确解的方法往往无法提供准确的估计。

2)近似解

近似解的求解方式则是通过迭代的方式,即通过样本的协方差矩阵对协方差矩阵进行估计。迭代算法有两种:一种是基于EM算法,另一种是基于协商迭代(coherence iteration)算法。在PPCA的Python实现中,主要采用的是协商迭代算法。

协商迭代算法属于迭代优化算法的一种,该算法基于蒙特卡罗方法推导出马尔科夫链的状态转移矩阵,并进一步推导出该矩阵的参数。状态转移矩阵特指各状态间的转移概率。在PPCA的Python实现中,所采用的马尔科夫链阶数为1。

(2)(2)EM算法

Expectation Maximization (EM)算法是一种迭代优化方法,广泛应用于数理统计领域,主要用于估计这些模型的参数,尤其是极大似然估计。在PPCA的Python实现中,通过EM算法可以估计马尔科夫链的状态转移概率矩阵。该算法的基本思路是通过最大化目标函数来求解参数的最优估计值。

其中,似然函数L(\theta,\Phi,\lambda_i)表示观测数据的似然,参数的后验分布由\Phi表示,观测数据的权重由\lambda_i表示,模型的参数为\theta,观测数据的数量为m

KL(\theta || |\Phi|)_1表示参数\Theta与参数后验分布\Phi之间的KL散度。KL散度用于衡量两个概率分布之间的差异程度。当两个分布完全相同时,KL散度的值为0;当两个分布越接近时,KL散度的值越大。

\text{H}(\theta)表示模型的复杂度,H表示熵。熵越大,则模型越复杂。

EMA采用了以下步骤:首先对参数Φ和θ进行初始化,然后利用EMA算法进行迭代优化。在迭代过程中,随后对参数φ进行估计。

其中,\epsilon是用于截止条件的阈值参数。我们的目标是找到一个\Phi,其对应的KL散度KL(\theta || |\Phi|)_1低于设定的阈值\epsilon。接下来,我们通过贝叶斯公式推导出参数\theta的后验概率分布。

\hat{\theta}_i = \frac{1}{\sum_{t=1}^T\alpha_{ti}}\sum_{t=1}^T\alpha_{ti}(x_i,z^{(t)})

其中,\alpha_{ti}表示马尔科夫链的状态转移概率。

最后,我们更新参数\theta\Phi

(3)(3)迭代优化算法

迭代优化方法用于协方差矩阵估计,其基本思路是构建一个马尔可夫链模型,初始状态设为0,通过转移概率进行状态转移过程,直至收敛条件满足。在基于Python的PPCA实现中,采用的是改进型的EM算法。

改进的EM算法其核心思路在于,为每一个观测数据生成一个子分布,该子分布属于当前整体分布的联合结构。通过观测数据,我们可以对这个子分布进行更新,使其更贴近真实分布的状态。经过一轮迭代更新后,所有子分布会趋于一致,形成一个更为精确的整体分布。

(4)(4)缺失值处理

在PPCA的Python实现中,我们提供了两种处理缺失值的策略。第一种方法是基于最近邻插补法,第二种方法是利用EM算法估计协方差矩阵。处理缺失值的方法对协方差矩阵的估计结果会产生影响。当缺失值数量较小时,采用EM算法估计协方差矩阵更为有效;而当缺失值数量较多时,采用最近邻插补法进行缺失值填充则更为合适。在PPCA的Python实现中,通常会采用EM算法来估计协方差矩阵。

(5)(5)代码实现

该方法的Python实现主要依赖于numpy库,并参考文献[1]中的相关内容。具体实现细节可参考以下代码段。

复制代码
    import numpy as np
    from sklearn.decomposition import PCA
    
    
    class ProbabilisticPCA():
    def __init__(self, n_components=None, max_iter=100):
        self.n_components = n_components   # 降维后的维度
        self.max_iter = max_iter           # EM算法迭代次数
    
    def fit(self, X, method='em'):
        """
        参数设置:
            X: 输入变量, shape=(n_samples, n_features)
        返回:
            self: object
    
        Example usage:
            from sklearn.datasets import load_iris
            iris = load_iris()
            X = iris['data']
    
            ppca = ProbabilisticPCA()
            ppca.fit(X)
    
            print("降维后的维度:",ppca.n_components_)
            print("协方差矩阵的特征值",ppca.explained_variance_)
            print("协方差矩阵的特征向量",ppca.components_.T)
            print("降维后的输入变量的均值",ppca.mean_)
            print("协方差矩阵的均值",np.cov(X.T))
        """
    
        m, n = X.shape                 # 样本个数和特征个数
        mean_X = np.mean(X, axis=0)    # 求输入变量的均值
    
        if self.n_components is None or self.n_components > min(m, n):
            self.n_components = min(m, n)      # 降维后的维度不超过输入变量的维度
    
        cov_mat = np.cov(X.T)             # 计算输入变量的协方差矩阵
    
        if method == 'exact':              # 精确解
            W, _ = np.linalg.eig(cov_mat)    # 获取协方差矩阵的特征值与特征向量
            ind = np.argsort(W)[::-1][:self.n_components]     # 从大到小排列特征值对应的索引
            self.components_ = X.T[:].dot(cov_mat).dot(pca.components_[ind]) / (X.shape[0]-1) 
            self.explained_variance_ = sorted([(W[idx], idx) for idx in ind])[::-1][0:self.n_components]
    
            return self
    
        else:                               # 近似解
            cov_inv = np.linalg.inv(cov_mat + np.eye(n)*1e-6)        # 添加了噪声的协方差矩阵的逆
            mu = np.zeros((n,))                                            # 初始化均值向量
            phi = np.ones((n+1, self.n_components))/float(n+1)            # 初始化状态转移矩阵
    
            converged = False                                             # 初始化是否收敛标志
            itercount = 0                                                # 初始化迭代次数
    
            while not converged:
                prev_params = [mu, phi[:, :-1]]                            # 保存之前的参数
                mu, phi[:, :-1] = self._update_posterior(X, mean_X, cov_inv, mu, phi) # 更新参数
                convdiff = sum([abs(prev_params[0][k]-mu[k]) for k in range(len(mu))])+sum([abs(prev_params[1][:, j]-phi[:, j]) for j in range(len(phi)-1)])
                if convdiff < 1e-5*n**2:                                   # 判断是否收敛
                    converged = True                                        # 如果收敛则退出
                    break
    
                itercount += 1                                             # 迭代次数增加
                if itercount >= self.max_iter:                             # 超过最大迭代次数则退出
                    break
    
            _, var = self._update_moments(mu, phi)                         # 更新协方差矩阵的均值向量与协方差矩阵
            self.components_, self.explained_variance_ = self._get_principal_components(var, mean_X) 
    
            return self
    
    @staticmethod
    def _update_posterior(X, mean_X, cov_inv, mu, phi):
        """
        更新参数
        """
        zeta = []                                                         # 初始化主题变量
        beta = []                                                         # 初始化系数
    
        num_obs = len(X)                                                  # 数据条目数
    
        for i in range(num_obs):
            xi = X[i,:] - mean_X                                          # 减去均值
            gamma = np.random.dirichlet(phi[:-1]*xi.T, size=1)[0]          # 用Dirichlet分布生成标记变量
            pi = phi[-1]*gamma                                              # 计算发射概率
            rho = np.random.multivariate_normal(mu+gamma*(xi-pi*mu)/pi, cov_inv)
            zeta.append(rho)                                              # 添加主题变量
            beta.append(beta)                                             # 添加系数
    
        Z = np.array(zeta)                                                 # 主题变量数组
        B = np.array(beta)                                                 # 概率数组
    
        N = X.shape[0]                                                     # 样本个数
        T = X.shape[1]                                                     # 特征个数
    
        A = np.hstack([B.reshape((-1,1)), Z.reshape((-1,1))+mu.reshape((-1,1)).T]).T
    
       # 对角化矩阵A
        eigval, eigvec = np.linalg.eig(np.cov(A.T))                        # 计算矩阵A的特征值与特征向量
        sort_index = np.argsort(eigval)[::-1]                              # 从大到小排列特征值对应的索引
        phi = eigvec[:,sort_index].T                                      # 重新排序特征向量
    
        phi /= np.sum(phi, axis=1).reshape((-1,1))                          # 沿着行归一化
    
        mu = np.mean(Z,axis=0)+(cov_inv@phi[:,:-1]<EMAIL>)@(np.diagflat(np.sqrt(np.diag(cov_inv)))@B).T 
        mu -= mean_X                                                       # 修正均值向量
    
        return mu, phi
    
    @staticmethod
    def _update_moments(mu, phi):
        """
        更新均值向量与协方差矩阵的均值向量
        """
        S = phi[:,:-1]*(mu-phi[:,-1].reshape((-1,1))).T                      # 更新均值向量与协方差矩阵的均值向量
    
        inv_S = np.linalg.inv(S+(S==0)*1e-6)                                  # 添加噪声的协方差矩阵的逆
    
        var = np.linalg.inv(inv_S)                                               # 更新协方差矩阵
        return mu, var
    
    @staticmethod
    def _get_principal_components(cov_mat, mean_X):
        """
        获取主成分
        """
        U, s, V = np.linalg.svd(cov_mat)                                       # SVD分解
        components = U.T                                                       # 获取特征向量
        explained_variance = [(s[i], i) for i in range(min(U.shape))]         # 获取特征值
    
        return components.dot(np.diag(s)), list(reversed(explained_variance))[0:len(components)]
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

PPCA的代码实现主要涉及init方法,用于初始化对象参数。fit方法负责完成PPCA模型的训练过程,包括估计协方差矩阵并执行降维操作。

(2)时间序列数据建模及异常检测

在时间序列数据建模及异常检测任务中,该算法具有广泛的应用价值。以时间序列数据建模为例,阐述PPCA算法在建模和异常检测中的应用。该方法通过降维技术提取数据的主要特征,从而实现对复杂时间序列数据的高效建模。具体而言,首先需要对时间序列数据进行预处理,去除噪声并提取关键特征。随后,利用PPCA算法对建模过程进行优化,确保模型的准确性和稳定性。最后,通过建立异常检测指标,实现对异常数据的及时识别和处理。

(1)(1)时间序列数据建模

在时间序列数据建模任务中,我们的目标是基于现有数据预测未来的时间序列数据。对于时间序列数据建模任务,我们通常采用ARIMA模型,ARIMA模型是一种经典的用于时间序列预测的工具。

ARIMA模型的核心理念在于,时间序列数据通常包含稳定的趋势,同时受季节性因素和随机噪声的影响。在ARIMA模型中,我们通过建模来估计几个关键参数:首先,趋势部分采用指数平滑移动平均方法(Exponential Smoothing)来计算平滑系数;其次,季节性变化则通过SARIMA模型中的相关系数进行分析;最后,随机波动部分则通过白噪声系数来描述。

通过ML方法,可以实现ARIMA模型的估计。具体而言,即通过拟合现有数据建立ARIMA模型,并估计其参数,以使模型与观测数据保持一致。在时序数据建模任务中,由于存在大量未观测的数据,直接求解MLE变得不可行,因此通常采用其他方法,如PPCA算法。

PPCA算法通过估计其协方差矩阵的参数,揭示数据的分布规律和内在结构特征,从而为时序数据建模提供了有效手段。在时序数据建模任务中,我们需要注意,时序数据中存在多种特殊现象,例如周期性变化、跳跃性变化、复相关关系、相关性交叉以及扬升性与倾斜性等。PPCA算法能够有效建模时序数据中的相关性特征,从而显著提升建模效率。

(2)(2)时间序列数据的异常检测

在时间序列数据的异常检测任务中,我们的目标是识别出异常的数据点。该算法在时间序列数据的异常检测任务中具有应用价值。通过降维技术,该算法能够识别出异常数据点。该算法能够将时序数据映射至低维空间,从而揭示数据间的内在关联性。在低维空间中,各数据点之间缺乏显著的相关性,这表明时序数据中可能存在异常点。

在金融领域,PPCA算法有助于分析股票市场价格走势的异常现象及其原因。当遇到价格异常时,可以通过技术分析手段找出原因所在。

(3)(3)代码实现

在时间序列数据建模及异常检测领域,PPCA算法及其应用已取得显著成果。在Python的scikit-learn库中,PPCA算法的实现方式如下:

复制代码
    from scipy.signal import periodogram
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.metrics import mean_squared_error
    from sklearn.model_selection import train_test_split
    from sklearn.pipeline import Pipeline
    from sklearn.linear_model import Ridge
    from sklearn.decomposition import KernelPCA
    from sklearn.ensemble import RandomForestRegressor
    from pyod.models.iforest import IForest
    from pyod.utils.utility import standardizer
    from pyod.utils.outlier_detection import evaluate_print
    from pyod.models.abod import ABOD
    
    def preprocessor(X):
    """
    预处理函数
    """
    scaler = MinMaxScaler()
    X = scaler.fit_transform(X)
    X = np.log(X)
    f, Pxx = periodogram(X, fs=1)
    return X, Pxx
    
    def decomposer(X, max_dim=None):
    """
    模型构建函数
    """
    pipeline = Pipeline([('pca', KernelPCA()), ('regressor', RandomForestRegressor())])
    if max_dim is not None:
        pipeline.set_params(pca__n_components=max_dim)
    return pipeline.fit(X)
    
    def detector(X, clf):
    """
    异常检测函数
    """
    clf.fit(standardizer(X))
    scores = clf.decision_scores_
    threshold = np.percentile(scores, q=100 * 0.01)
    y_pred = [1 if s > threshold else 0 for s in scores]
    outliers_fraction = np.sum(y_pred) / float(len(y_pred))
    evaluate_print('IForest', y_pred, outliers_fraction)
    evaluate_print('ABOD', y_pred, outliers_fraction)
    return clf
    
    if __name__ == '__main__':
    # 数据加载与预处理
    df = pd.read_csv('./data/dataset.csv')
    target = df['target'].values
    X = df.drop(['time','target'], axis=1).values
    X, Pxx = preprocessor(X)
    fig = plt.figure()
    ax1 = fig.add_subplot(211)
    ax1.plot(df['time'], X[:,0])
    ax2 = fig.add_subplot(212)
    ax2.plot(df['time'], Pxx)
    plt.show()
    
    # 建模
    estimator = decomposer(X, max_dim=2)
    predictions = estimator.predict(X)
    mse = mean_squared_error(predictions, target)
    r2score = metrics.r2_score(predictions, target)
    print("MSE: %.4f" % mse)
    print("R-Squared Score: %.4f" % r2score)
    
    # 异常检测
    clf = IForest()
    det = detector(X, clf)
    clf = ABOD()
    det = detector(X, clf)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在数据加载和预处理阶段,我们对数据进行了加载和预处理工作,包括归一化处理、取对数以及生成光谱图。接着,通过KernelPCA算法对数据进行降维处理,并确定主成分数量为2。

在模型建模阶段,我们搭建了一个Pipeline模型,其中包含KernelPCA降维技术与随机森林回归器。当设定好了降维后的维度参数时,就需要相应调整KernelPCA的主成分数量。随后,我们通过训练数据对模型进行训练,评估模型的均方误差损失函数以及R-Squared Score作为模型评估指标。

在异常检测阶段,我们采用了Isolation Forest(IForest)算法和Angle-based Outlier Detector(ABOD)算法来进行异常检测。其中,IForest算法具有自动调节能力,能够根据数据特征动态设定分割阈值,而ABOD算法则需要人工设定分割阈值。经过评估,我们输出了IForest与ABOD算法的详细结果报告,涵盖包括TPR、FPR、AUROC、Precision、Recall、F1-Score和Accuracy在内的各项关键指标。

全部评论 (0)

还没有任何评论哟~