SVM.py 3.25 KB
'''
SVM Model.

@author: chunk
chunkplus@gmail.com
2014 Dec
'''
from mfeat import *
from mmodel import *

from common import *
import numpy as np
import csv
import json
import pickle
import cv2
from sklearn import svm


dict_Train = {}
dict_databuf = {}
dict_tagbuf = {}
dict_featbuf = {}


class ModelSVM(ModelBase):
    def __init__(self):
        ModelBase.__init__(self)


    def _train_sk(self, X, Y):
        lin_clf = svm.LinearSVC()
        lin_clf.fit(X, Y)
        with open('res/svm_sk.model', 'wb') as modelfile:
            model = pickle.dump(lin_clf, modelfile)

        self.model = lin_clf

        return lin_clf


    def _predict_sk(self, feat, model=None):
        """N.B. sklearn.svm.base.predict :
            Perform classification on samples in X.
                Parameters
                ----------
                X : {array-like, sparse matrix}, shape = [n_samples, n_features]

                Returns
                -------
                y_pred : array, shape = [n_samples]
                    Class labels for samples in X.
        """
        if model is None:
            if self.model != None:
                model = self.model
            else:
                with open('res/svm_sk.model', 'rb') as modelfile:
                    model = pickle.load(modelfile)

        return model.predict(feat)

    def _test_sk(self, X, Y, model=None):
        if model is None:
            if self.model != None:
                model = self.model
            else:
                with open('res/svm_sk.model', 'rb') as modelfile:
                    model = pickle.load(modelfile)

        result_Y = np.array(self._predict_sk(X, model))

        print result_Y == Y
        return np.mean(Y == result_Y)


    def _train_cv(self, X, Y):
        svm_params = dict(kernel_type=cv2.SVM_LINEAR,
                          svm_type=cv2.SVM_C_SVC,
                          C=2.67, gamma=5.383)

        X, Y = np.array(X, dtype=np.float32), np.array(Y, dtype=np.float32)

        timer = Timer()
        timer.mark()
        svm = cv2.SVM()
        svm.train(X, Y, params=svm_params)
        svm.save('res/svm_cv.model')

        self.model = svm

        return svm


    def _predict_cv(self, feat, model=None):
        if model is None:
            if self.model != None:
                model = self.model
            else:
                with open('res/svm_cv.model', 'rb') as modelfile:
                    model = pickle.load(modelfile)
        feat = np.array(feat, dtype=np.float32)

        return model.predict(feat)


    def _test_cv(self, X, Y, model=None):
        if model is None:
            if self.model != None:
                model = self.model
            else:
                with open('res/svm_cv.model', 'rb') as modelfile:
                    model = pickle.load(modelfile)

        X, Y = np.array(X, dtype=np.float32), np.array(Y, dtype=np.float32)

        # result_Y = np.array([self._predict_cv(x, model) for x in X])
        result_Y = np.array(model.predict_all(X)).ravel()

        return np.mean(Y == result_Y)


    def train(self, X, Y):
        return self._train_cv(X, Y)

    def predict(self, feat, model=None):
        return self._predict_cv(feat, model)

    def test(self, X, Y, model=None):
        return self._test_cv(X, Y, model)