예제 #1
0
파일: SSA.cs 프로젝트: mlnethub/daany
        /// <summary>
        /// Reconstruct series by providing indices of list of elementary matrices
        /// </summary>
        /// <param name="signalIndex">list of indices of elementary matrices</param>
        /// <returns></returns>
        public double[] Reconstruct(params int[] group)
        {
            //reconstructed ts
            var rts = MatrixEx.Zeros(_ts.Count());

            for (int i = 0; i < group.Length; i++)
            {
                var sm     = EM[group[i]];
                var retVal = diagonalAveraging(sm);
                rts = rts.Add(retVal);
            }

            return(rts);
        }
예제 #2
0
파일: SSA.cs 프로젝트: ironcev-forks/daany
        void prepareForecast(int singularsValuesCount)
        {
            double vertCoeff = 0;

            double[][] forecastOrthonormalVal;
            var        L         = _xCom.GetLength(0);
            var        K         = _xCom.GetLength(1);
            var        X_com_hat = MatrixEx.Zeros(L, K);

            if (singularsValuesCount >= 0)
            {
                var len = Math.Min(singularsValuesCount, _orthonormalBase.Length);
                forecastOrthonormalVal = new double[len][];
                for (int i = 0; i < len; i++)
                {
                    forecastOrthonormalVal[i] = _orthonormalBase[i];
                }
            }
            else
            {
                forecastOrthonormalVal = _orthonormalBase;
            }

            var valR = MatrixEx.Zeros(forecastOrthonormalVal[0].Length, 1);
            var tmp  = valR.GetColumn(valR.GetLength(1) - 1);

            _R = tmp.Take(tmp.Count() - 1).ToArray();
            for (int i = 0; i < forecastOrthonormalVal.Length; i++)
            {
                //
                var PI   = forecastOrthonormalVal[i];
                var prod = PI.ToMatrix(true).Dot(PI.ToMatrix(false));
                var temp = prod.Dot(_xCom);
                X_com_hat = X_com_hat.Add(temp);
                //
                var pi = PI.Last();
                vertCoeff += pi * pi;
                var rr = PI.Take(PI.Length - 1).ToArray().Multiply(pi);
                _R = _R.Add(rr);
            }
            _R          = _R.Divide((1.0 - vertCoeff));
            X_com_tilde = diagonalAveraging(X_com_hat);
        }
예제 #3
0
파일: SSA.cs 프로젝트: ironcev-forks/daany
        /// <summary>
        /// Reconstruct time series component from the signal matrix
        /// </summary>
        /// <param name="xs">number of signal matrix</param>
        /// <returns></returns>
        public double[] Reconstruct(int signalCounts = -1)
        {
            double[] tsCumulative = null;
            IEnumerable <KeyValuePair <int, double[, ]> > sM = _Xs;

            if (signalCounts > 0)
            {
                sM = _Xs.Take(signalCounts);
            }
            //initi ts
            tsCumulative = MatrixEx.Zeros(_ts.Count());
            foreach (var sMat in sM)
            {
                var retVal = diagonalAveraging(sMat.Value);
                tsCumulative = tsCumulative.Add(retVal);
            }

            return(tsCumulative);
        }
예제 #4
0
파일: SSA.cs 프로젝트: ironcev-forks/daany
        /// <summary>
        /// transform each matrix XIj of the grouped decomposition into a new series of length N
        /// </summary>
        /// <returns>elementary reconstructed series</returns>
        private double[] diagonalAveraging(double[,] signalMatrix)
        {
            var L = signalMatrix.GetLength(0);
            var K = signalMatrix.GetLength(1);
            var Y = signalMatrix;

            int lStar = Math.Min(L, K);
            int kStar = Math.Max(L, K);
            int N     = L + K - 1;
            //
            var newM = MatrixEx.Zeros(L, K);

            //
            if (L >= K)
            {
                Y = Y.Transpose();
            }

            //reconstructed series
            var y = new double[N];

            for (int k = 1; k <= N; k++)
            {
                double yk = 0;
                if (k >= 1 && k < lStar)
                {
                    for (int m = 1; m <= k; m++)
                    {
                        int i = m;
                        int j = k - m + 1;
                        yk += Y[i - 1, j - 1];//zero based index
                    }
                    //
                    y[k - 1] = yk / k;
                }
                else if (k >= lStar && k <= kStar)
                {
                    for (int m = 1; m <= lStar; m++)
                    {
                        int i = m;
                        int j = k - m + 1;
                        yk += Y[i - 1, j - 1];//zero based index
                    }
                    //
                    y[k - 1] = yk / lStar;
                }
                else if (k > kStar && k <= N)
                {
                    for (int m = k - kStar + 1; m <= N - kStar + 1; m++)
                    {
                        int i = m;
                        int j = k - m + 1;
                        yk += Y[i - 1, j - 1];//zero based index
                    }
                    //
                    y[k - 1] = yk / (N - k + 1);
                }
                else
                {
                    throw new Exception("This should not be happen!");
                }
            }
            return(y);
        }
예제 #5
0
파일: SSA.cs 프로젝트: mlnethub/daany
        /// <summary>
        /// transform each matrix Xij of the grouped decomposition into a new series of length N
        /// </summary>
        /// <returns>elementary reconstructed series</returns>
        private double[] diagonalAveraging(double[,] eMatrix)
        {
            //calculate number of cols, rows and
            var LL = eMatrix.GetLength(0);
            var KK = eMatrix.GetLength(1);
            var Y  = eMatrix;

            int lStar = Math.Min(LL, KK);
            int kStar = Math.Max(LL, KK);
            int N     = LL + KK - 1;
            //
            var newM = MatrixEx.Zeros(L, K);

            //
            if (LL >= KK)
            {
                Y = Y.Transpose();
            }

            //reconstructed series
            var y = new double[N];

            for (int k = 1; k <= N; k++)
            {
                double yk = 0;
                if (k >= 1 && k < lStar)
                {
                    for (int m = 1; m <= k; m++)
                    {
                        int i = m;
                        int j = k - m + 1;
                        yk += Y[i - 1, j - 1];
                    }
                    //
                    y[k - 1] = yk / k;
                }
                else if (k >= lStar && k <= kStar)
                {
                    for (int m = 1; m <= lStar; m++)
                    {
                        int i = m;
                        int j = k - m + 1;
                        yk += Y[i - 1, j - 1];
                    }
                    //
                    y[k - 1] = yk / lStar;
                }
                else if (k > kStar && k <= N)
                {
                    for (int m = k - kStar + 1; m <= N - kStar + 1; m++)
                    {
                        int i = m;
                        int j = k - m + 1;
                        yk += Y[i - 1, j - 1];
                    }
                    //
                    y[k - 1] = yk / (N - k + 1);
                }
                else
                {
                    throw new Exception("This should not be happened!");
                }
            }
            return(y);
        }