Exemplo n.º 1
0
        /// <summary>
        /// SVMを最適なパラメータで学習する
        /// </summary>
        /// <param name="trainData"></param>
        /// <param name="responses"></param>
        /// <param name="varIdx"></param>
        /// <param name="sampleIdx"></param>
        /// <param name="param"></param>
        /// <param name="kFold">交差検定(Cross-validation)パラメータ.学習集合は,k_foldの部分集合に分割され,一つの部分集合がモデルの学習に用いられ,その他の部分集合はテスト集合となる.つまり,SVM アルゴリズムは,k_fold回実行される.</param>
        /// <param name="cGrid"></param>
        /// <param name="gammaGrid"></param>
        /// <param name="pGrid"></param>
        /// <param name="nuGrid"></param>
        /// <param name="coefGrid"></param>
        /// <param name="degreeGrid"></param>
        /// <param name="balanced"></param>
        /// <returns></returns>
#else
        /// <summary>
        /// Trains SVM with optimal parameters
        /// </summary>
        /// <param name="trainData"></param>
        /// <param name="responses"></param>
        /// <param name="varIdx"></param>
        /// <param name="sampleIdx"></param>
        /// <param name="param"></param>
        /// <param name="kFold">Cross-validation parameter. The training set is divided into k_fold subsets, one subset being used to train the model, the others forming the test set. So, the SVM algorithm is executed k_fold times. </param>
        /// <param name="cGrid"></param>
        /// <param name="gammaGrid"></param>
        /// <param name="pGrid"></param>
        /// <param name="nuGrid"></param>
        /// <param name="coefGrid"></param>
        /// <param name="degreeGrid"></param>
        /// <param name="balanced"></param>
        /// <returns></returns>
#endif
        public virtual bool TrainAuto(
            Mat trainData,
            Mat responses,
            Mat varIdx,
            Mat sampleIdx,
            CvSVMParams param,
            int kFold = 10,
            CvParamGrid? cGrid = null,
            CvParamGrid? gammaGrid = null,
            CvParamGrid? pGrid = null,
            CvParamGrid? nuGrid = null,
            CvParamGrid? coefGrid = null,
            CvParamGrid? degreeGrid = null,
            bool balanced = false)
        {
            if (trainData == null)
                throw new ArgumentNullException("trainData");
            if (responses == null)
                throw new ArgumentNullException("responses");
            if (varIdx == null)
                throw new ArgumentNullException("varIdx");
            if (sampleIdx == null)
                throw new ArgumentNullException("sampleIdx");
            trainData.ThrowIfDisposed();
            responses.ThrowIfDisposed();
            varIdx.ThrowIfDisposed();
            sampleIdx.ThrowIfDisposed();

            if (param == null)
                param = new CvSVMParams();
            var defaultGrid = GetDefaultGrid(SVMParamType.C);
            var cGrid0 = cGrid.GetValueOrDefault(defaultGrid);
            var gammaGrid0 = gammaGrid.GetValueOrDefault(defaultGrid);
            var pGrid0 = pGrid.GetValueOrDefault(defaultGrid);
            var nuGrid0 = nuGrid.GetValueOrDefault(defaultGrid);
            var coefGrid0 = coefGrid.GetValueOrDefault(defaultGrid);
            var degreeGrid0 = degreeGrid.GetValueOrDefault(defaultGrid);

            return NativeMethods.ml_CvSVM_train_auto_CvMat(
                ptr,
                trainData.CvPtr,
                responses.CvPtr,
                varIdx.CvPtr,
                sampleIdx.CvPtr,
                param.NativeStruct,
                kFold,
                cGrid0,
                gammaGrid0,
                pGrid0,
                nuGrid0,
                coefGrid0,
                degreeGrid0,
                balanced ? 1 : 0) != 0;
        }