コード例 #1
0
        public double ComputeCost(List <T> data_set)
        {
            int sample_count = data_set.Count;

            if (sample_count == 0)
            {
                throw new ArgumentException("data set is empty!");
            }
            int x_dimension = data_set[0].X.Length;
            int y_dimension = data_set[0].UserRanks.Length;

            Matrix <double> X_matrix = new SparseMatrix(sample_count, x_dimension + 1, 0);
            Matrix <double> Y_matrix = new SparseMatrix(sample_count, y_dimension, 0);

            int[,] r_matrix = new int[sample_count, y_dimension];

            int dimension = y_dimension * (x_dimension + 1);

            for (int i = 0; i < sample_count; ++i)
            {
                X_matrix[i, 0] = 1;
                T        rating = data_set[i];
                double[] X      = rating.X;
                double[] Y      = rating.UserRanks;
                bool[]   r      = rating.IsRated;

                for (int d = 0; d < x_dimension; ++d)
                {
                    X_matrix[i, d + 1] = X[d];
                }

                for (int d = 0; d < y_dimension; ++d)
                {
                    Y_matrix[i, d] = Y[d];
                    r_matrix[i, d] = r[d] ? 1 : 0;
                }
            }

            ContentBasedRSCostFunction f = new ContentBasedRSCostFunction(X_matrix, Y_matrix, r_matrix, sample_count, dimension);

            f.RegularizationLambda = 0;
            return(f.Evaluate(mTheta));
        }
コード例 #2
0
        public void Compute(List <T> data_set)
        {
            int n_m = data_set.Count;

            if (n_m == 0)
            {
                throw new ArgumentException("Data set is empty!");
            }
            int x_dimension = data_set[0].X.Length;
            int n_u         = data_set[0].UserRanks.Length;

            Matrix <double> X_matrix = new SparseMatrix(n_m, x_dimension + 1, 0);
            Matrix <double> Y_matrix = new SparseMatrix(n_m, n_u, 0);

            int[,] r_matrix = new int[n_m, n_u];

            int dimension = n_u * (x_dimension + 1);

            for (int i = 0; i < n_m; ++i)
            {
                X_matrix[i, 0] = 1;
                T        rating = data_set[i];
                double[] X      = rating.X;
                double[] Y      = rating.UserRanks;
                bool[]   r      = rating.IsRated;

                for (int d = 0; d < x_dimension; ++d)
                {
                    X_matrix[i, d + 1] = X[d];
                }

                for (int d = 0; d < n_u; ++d)
                {
                    Y_matrix[i, d] = Y[d];
                    r_matrix[i, d] = r[d] ? 1 : 0;
                }
            }

            if (mCalcMode == CalcMode.GradientDescent)
            {
                ContentBasedRSCostFunction f = new ContentBasedRSCostFunction(X_matrix, Y_matrix, r_matrix, n_m, dimension);
                f.RegularizationLambda = mRegularizationLambda;
                double[] theta_0 = new double[dimension];
                for (int d = 0; d < dimension; ++d)
                {
                    theta_0[d] = 0;
                }
                ContinuousSolution solution = mLocalSearcher.Minimize(theta_0, f, mMaxSolverIteration);

                mTheta = solution.Values;
            }
            else if (mCalcMode == CalcMode.NormalEquation)
            {
                Matrix <double> X_transpose_matrix   = X_matrix.Transpose();
                Matrix <double> X_transpose_X_matrix = X_transpose_matrix.Multiply(X_matrix);
                Matrix <double> X_transpose_Y_matrix = X_transpose_matrix.Multiply(Y_matrix);

                Matrix <double> X_transpose_X_inverse_matrix = null;
                if (mEnsureNormalEquationInvertibility)
                {
                    Matrix <double> lambda_matrix = SparseMatrix.Identity(dimension);
                    for (int d = 0; d < x_dimension + 1; ++d)
                    {
                        lambda_matrix[d, d] = (d == 0) ? 0 : mNormalEquationInventibilityLambda;
                    }
                    X_transpose_X_inverse_matrix = (X_transpose_X_matrix + lambda_matrix).Inverse();
                }
                else
                {
                    X_transpose_X_inverse_matrix = X_transpose_X_matrix.Inverse();
                }
                Matrix <double> theta_matrix = X_transpose_X_inverse_matrix.Multiply(X_transpose_Y_matrix);
                mTheta = new double[dimension];
                for (int d1 = 0; d1 < n_u; ++d1)
                {
                    for (int d2 = 0; d2 < x_dimension + 1; ++d2)
                    {
                        int index = d1 * (x_dimension + 1) + d2;
                        mTheta[index] = theta_matrix[d2, d1];
                    }
                }
            }

            for (int i = 0; i < n_m; ++i)
            {
                PredictRank(data_set[i]);
            }
        }