svm-simple 0.2.2 → 0.2.5
raw patch · 3 files changed
+29/−12 lines, 3 files
Files
- AI/SVM/Base.hs +2/−3
- AI/SVM/Simple.hs +22/−8
- svm-simple.cabal +5/−1
AI/SVM/Base.hs view
@@ -23,12 +23,12 @@ -- * Types SVM , SVMType(..), Kernel(..)- , SVMVector(..)+ , SVMVector(..) ,getNRClasses -- * File operations ,loadSVM, saveSVM -- * Training- ,trainSVM --, crossvalidate+ ,trainSVM, crossvalidate -- * Prediction ,predict ) where@@ -331,7 +331,6 @@ -- |Cross validate SVM. This is faster than training and predicting for each fold -- separately, since there are no extra conversions done between libsvm and haskell.--- Currently broken. crossvalidate :: (SVMVector b) => SVMType -> Kernel -> Int -> [(Double, b)] -> IO (String, [Double]) crossvalidate svm kernel folds (map (second convert) -> dataSet) = do
AI/SVM/Simple.hs view
@@ -39,11 +39,11 @@ ,Kernel(..) ,SVMOneClass(), SVMClassifier(), SVMRegressor() -- * Classifier machines- ,trainClassifier, classify + ,trainClassifier, crossvalidateClassifier, classify -- * One class machines ,trainOneClass, inSet, OneClassResult(..) -- * Regression machines- ,trainRegressor, predictRegression+ ,trainRegressor, crossvalidateRegressor, predictRegression -- * Unfortunate utilities ,Persisting(..) ) where@@ -127,15 +127,25 @@ -> Kernel -> [(a, b)] -> (String, SVMClassifier a)- trainClassifier ctype kernel dataset = unsafePerformIO $ do- let l = zip (nub . labels $ dataset) [1..]+ let (to,from, doubleDataSet) = convertToDouble dataset + (m,svm) <- trainSVM (generalizeClassifier ctype) kernel doubleDataSet+ return . (m,) $ SVMClassifier svm to from++convertToDouble dataset = let + l = zip (nub . map fst $ dataset) [1..] to = Map.fromList l from = Map.fromList $ map swap l- doubleDataSet = map ((\x -> to Map.! x) *** convert) dataset + in (to,from, map ((to Map.!) *** convert) dataset) - (m,svm) <- trainSVM (generalizeClassifier ctype) kernel doubleDataSet- return . (m,) $ SVMClassifier svm to from+-- | Perform n-foldl cross validation for given set of SVM parameters+crossvalidateClassifier :: (SVMVector b, Ord a) =>+ ClassifierType -> Kernel -> Int -> [(a, b)] + -> (String, [a])+crossvalidateClassifier ctype kernel folds dataset = unsafePerformIO $ do+ let (to,from, doubleDataSet) = convertToDouble dataset + (m,res :: [Double]) <- crossvalidate (generalizeClassifier ctype) kernel folds doubleDataSet+ return . (m,) $ map (from Map.!) res where labels = map fst @@ -148,7 +158,6 @@ trainOneClass :: SVMVector a => Double -> Kernel -> [a] -> (String, SVMOneClass) trainOneClass nu kernel dataset = unsafePerformIO $ do let doubleDataSet = map (const 1 &&& convert) dataset - (m,svm) <- trainSVM (ONE_CLASS nu) kernel doubleDataSet return . (m,) $ SVMOneClass svm @@ -171,6 +180,11 @@ let doubleDataSet = map (second convert) dataset (m,svm) <- trainSVM (generalizeRegressor rtype) kernel doubleDataSet return . (m,) $ SVMRegressor svm++crossvalidateRegressor rtype kernel folds dataset = unsafePerformIO $ do+ let doubleDataSet = map (second convert) dataset + (m,res) <- crossvalidate (generalizeRegressor rtype) kernel folds doubleDataSet+ return (m,res) -- | Predict value for given vector via regression predictRegression :: SVMVector a => SVMRegressor -> a -> Double
svm-simple.cabal view
@@ -1,11 +1,15 @@ name: svm-simple-version: 0.2.2+version: 0.2.5 synopsis: Medium level, simplified, bindings to libsvm description: This is a set of simplified bindings to libsvm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/> suite of support vector machines. This package provides tools for classification, one-class classification and support vector regression. .+ .+ Changes in version 0.2.5+ .+ * Crossvalidation for the high level interface . Changes in version 0.2.2 .