packages feed

svm-simple 0.2.2 → 0.2.5

raw patch · 3 files changed

+29/−12 lines, 3 files

Files

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   .