public double calculateScore(double input)
    {
        this.pastData.addFirst(input);
        int dataLength = this.pastData.size();

        // #############################################
        // ## オンライン忘却アルゴリズムSDARを用いて1段階学習を行う。
        // #############################################
        // 最尤推定値「μ」を更新する。
        this.estimatedMyu = (1 - this.forgetability) * this.estimatedMyu + this.forgetability
                * input;

        // 確率密度関数用の係数配列を更新する。
        // 算出される個数は「過去データの数」「自己回帰モデルの次数 + 1」のうち小さい方
        int pdfBaseNum = Math.min(dataLength, this.arDimensionNum + 1);
        for (int index = 0; index < pdfBaseNum; index++)
        {
            this.pdfBase[index] = (1 - this.forgetability) * this.pdfBase[index]
                    + this.forgetability * (input - this.estimatedMyu)
                    * Math.pow((this.pastData.get(index) - this.estimatedMyu), 1);
        }

        // パラメータ推定に用いる係数配列「ω」の算出を行う。
        // 確率密度関数用の係数配列のインデックスと異なり1オリジンのため配列インデックスも1から使用している。
        for (int yuleIndex = 1; yuleIndex < pdfBaseNum; yuleIndex++)
        {
            double nowPdfBase = this.pdfBase[yuleIndex];

            for (int index = 1; index < yuleIndex; index++)
            {
                nowPdfBase = nowPdfBase
                        - (this.pdfBase[yuleIndex - index] * this.yuleWalkerAns[index]);
            }

            double yuleResult = nowPdfBase / (this.pdfBase[0]);
            this.yuleWalkerAns[yuleIndex] = yuleResult;
        }

        // データの推測値を算出
        double estimatedValue = this.estimatedMyu;
        for (int index = 1; index < pdfBaseNum; index++)
        {
            double dataResult = this.pastData.get(index);
            double dist = this.yuleWalkerAns[index] * (dataResult - this.estimatedMyu);
            estimatedValue = estimatedValue + dist;
        }

        if (this.pastData.size() > this.arDimensionNum)
        {
            this.pastData.pollLast();
        }

        // Σの最尤推定値を算出
        this.estimatedSigma = (1 - this.forgetability) * this.estimatedSigma + this.forgetability
                * Math.pow((input - estimatedValue), 2);

        // 1段階学習結果スコアを算出
        double firstScore = calcFirstScore(estimatedValue, input, this.estimatedSigma,
                this.smoothingWindow);
        this.scores.add(firstScore);
        if (this.scores.size() > this.smoothingWindow)
        {
            this.scores.remove(0);
        }

        // #############################################
        // ## 平滑化を行う。
        // #############################################
        double movingAverage = smoothing(this.scores, this.smoothingWindow);

        if (logger.isDebugEnabled() == true)
        {
            String logFormat = "CalculateResult. Input={0}, Myu={1}, Sigma={2}, Estimated={3}, Score={4}, MovingAverage={5}";
            logger.debug(this.logHeader
                    + MessageFormat.format(logFormat, input, this.estimatedMyu,
                            this.estimatedSigma, estimatedValue, firstScore, movingAverage));
        }

        // #############################################
        // ## オンライン忘却アルゴリズムSDARを用いて2段階学習を行う。
        // ## フィールド「secondFinder」が存在している場合、2段階学習結果をスコアとして返す。
        // ## 存在していない場合は本インスタンス自身が2段階目のChangeFinderのため、平滑化の結果をそのまま返す。
        // #############################################
        if (this.secondChangeFinder == null)
        {
            return movingAverage;
        }

        double secondScore = this.secondChangeFinder.calculateScore(movingAverage);
        return secondScore;
    }
public double calculateScore ( double input ) { this . pastData . addFirst ( input ) ; int dataLength = this . pastData . size ( ) ; this . estimatedMyu = ( 1 - this . forgetability ) * this . estimatedMyu + this . forgetability * input ; int pdfBaseNum = Math . min ( dataLength , this . arDimensionNum + 1 ) ; for ( int index = 0 ; index < pdfBaseNum ; index ++ ) { this . pdfBase [ index ] = ( 1 - this . forgetability ) * this . pdfBase [ index ] + this . forgetability * ( input - this . estimatedMyu ) * Math . pow ( ( this . pastData . get ( index ) - this . estimatedMyu ) , 1 ) ; } for ( int yuleIndex = 1 ; yuleIndex < pdfBaseNum ; yuleIndex ++ ) { double nowPdfBase = this . pdfBase [ yuleIndex ] ; for ( int index = 1 ; index < yuleIndex ; index ++ ) { nowPdfBase = nowPdfBase - ( this . pdfBase [ yuleIndex - index ] * this . yuleWalkerAns [ index ] ) ; } double yuleResult = nowPdfBase / ( this . pdfBase [ 0 ] ) ; this . yuleWalkerAns [ yuleIndex ] = yuleResult ; } double estimatedValue = this . estimatedMyu ; for ( int index = 1 ; index < pdfBaseNum ; index ++ ) { double dataResult = this . pastData . get ( index ) ; double dist = this . yuleWalkerAns [ index ] * ( dataResult - this . estimatedMyu ) ; estimatedValue = estimatedValue + dist ; } if ( this . pastData . size ( ) > this . arDimensionNum ) { this . pastData . pollLast ( ) ; } this . estimatedSigma = ( 1 - this . forgetability ) * this . estimatedSigma + this . forgetability * Math . pow ( ( input - estimatedValue ) , 2 ) ; double firstScore = calcFirstScore ( estimatedValue , input , this . estimatedSigma , this . smoothingWindow ) ; this . scores . add ( firstScore ) ; if ( this . scores . size ( ) > this . smoothingWindow ) { this . scores . remove ( 0 ) ; } double movingAverage = smoothing ( this . scores , this . smoothingWindow ) ; if ( logger . isDebugEnabled ( ) == true ) { String logFormat = "CalculateResult. Input={0}, Myu={1}, Sigma={2}, Estimated={3}, Score={4}, MovingAverage={5}" ; logger . debug ( this . logHeader + MessageFormat . format ( logFormat , input , this . estimatedMyu , this . estimatedSigma , estimatedValue , firstScore , movingAverage ) ) ; } if ( this . secondChangeFinder == null ) { return movingAverage ; } double secondScore = this . secondChangeFinder . calculateScore ( movingAverage ) ; return secondScore ; }
指定した値を用いて変化点スコアを算出する。<br>
算出と同時に過去状態の更新も行う。

@param input 指定値
@return 変化点スコア