使用TensorFlow实现SVM

  

较基础的支持向量机,后续会加上多分类以及高斯核,供大家参考。

  

说说很简单,给我代码

        进口tensorflow特遣部队   从sklearn。基地进口BaseEstimator ClassifierMixin   进口numpy np      类TFSVM (BaseEstimator ClassifierMixin):      def __init__(自我,   C=1,内核=跋咝浴?   learning_rate=0.01,   training_epoch=1000,   display_step=50,   batch_size=50,   random_state=42):   #参数列表   自我。svmC=C   自我。内核=内核   自我。learning_rate=learning_rate   自我。training_epoch=training_epoch   自我。display_step=display_step   自我。random_state=random_state   自我。batch_size=batch_size      def reset_seed(自我):   #重置随机数   tf.set_random_seed (self.random_state)   np.random.seed (self.random_state)      def random_batch(自我,X, y):   #调用随机子集,实现mini-batch梯度下降法   指数=np.random。randint (1, X。self.batch_size形状[0])   X_batch=X(指数)   y_batch=y(指数)   返回X_batch y_batch      def _build_graph(自我、X_train y_train):   #创建计算图   self.reset_seed ()      n_instances n_inputs=X_train.shape      X=tf.placeholder (tf。float32,没有,n_inputs, name=' X ')   y=tf.placeholder (tf。[没有,1],float32 name=' y ')      与tf.name_scope (“trainable_variables”):   #决策边界的两个变量   W=tf.Variable (tf。truncated_normal(形状=[n_inputs 1], stddev=0.1), name=叭ㄖ亍?   b=tf.Variable (tf.truncated_normal ([1]), name=捌?      与tf.name_scope(“训练”):   #算法核心   y_raw=tf.add (tf。matmul (X, W), b)   l2_norm=tf.reduce_sum (tf.square (W))   hinge_loss=tf.reduce_mean (tf.maximum (tf.zeros(自我。batch_size, 1), tf.subtract (1。特遣部队。乘(y_raw, y))))   svm_loss=特遣部队。add (hinge_loss tf.multiply(自我。svmC, l2_norm))   training_op=tf.train。AdamOptimizer (learning_rate=self.learning_rate) .minimize (svm_loss)      与tf.name_scope (eval):   #正确率和预测   prediction_class=tf.sign (y_raw)   correct_prediction=特遣部队。平等(y, prediction_class)   精度=tf.reduce_mean (tf。铸造(correct_prediction tf.float32))      init=tf.global_variables_initializer ()      自我。值=X;自我。_y吗=y   自我。_loss=svm_loss;自我。_training_op=training_op   自我。_accuracy=精度;自我。init=自我。_prediction_class=prediction_class   自我。_W=W;自我。_b=b      def _get_model_params(自我):   #获取模型的参数,以便存储   与self._graph.as_default ():   gvars=tf.get_collection (tf.GraphKeys.GLOBAL_VARIABLES)   为gvar返回{gvar.op.name:价值,价值zip (gvars, self._session.run (gvars))}      def _restore_model_params(自我,model_params):   #保存模型的参数   gvar_names=列表(model_params.keys ())   assign_op={gvar_name: self._graph。get_operation_by_name (gvar_name +/分配)的gvar_name gvar_names}   init_values={gvar_name: assign_op。输入[1]gvar_name, assign_op assign_ops.items ()}   feed_dict={init_values [gvar_name]: model_params [gvar_name]的gvar_name gvar_names}   self._session.run (assign_op feed_dict=feed_dict)      def适合(自我,X, y, X_val=None, y_val=None):   #适合函数,注意要输入验证集   n_batches=X。[0]//self.batch_size形状      自我。_graph=tf.Graph ()   与self._graph.as_default ():   自我。_build_graph (X, y)      best_loss=np.infty   best_accuracy=0   best_params=没有   checks_without_progress=0   max_checks_without_progress=20      自我。_session=特遣部队。会话(图=self._graph)      与self._session.as_default税():   self.init.run ()      时代的范围(self.training_epoch):   batch_index的范围(n_batches):   X_batch y_batch=自我。random_batch (X, y)   sess.run (self._training_op feed_dict={自我。值:X_batch self._y: y_batch})   loss_val accuracy_val=sess.run ([self._loss,自我。_accuracy], feed_dict={自我。值:X_val,自我。_y吗:y_val})   accuracy_train=self._accuracy。eval (feed_dict={自我。值:X_batch,自我。_y吗:y_batch})      如果loss_val & lt;best_loss:   best_loss=loss_val   best_params=self._get_model_params ()   checks_without_progress=0   其他:   checks_without_progress +=1   如果checks_without_progress比;max_checks_without_progress:   打破      如果accuracy_val比;best_accuracy:   best_accuracy=accuracy_val   # best_params=self._get_model_params ()      如果时代%的自我。display_step==0:   打印(“时代:{}\ tValidaiton失:{:。6 f} \ tValidation准确性:{:。4 f} \ tTraining准确性:{:.4f}”   .format(时代、loss_val accuracy_val accuracy_train))   打印(“最佳精度:{:。4 f} \结核病损失:{:.6f}”。格式(best_accuracy best_loss))   如果best_params:   self._restore_model_params (best_params)   自我。_intercept=best_params (‘trainable_variables/重量)   自我。_bias=best_params (“trainable_variables/偏见”)   回归自我      def预测(自我,X):   与self._session.as_default税():   self._prediction_class返回。eval (feed_dict={自我。值:X})      def _intercept(自我):   返回self._intercept      def _bias(自我):   返回self._bias   

使用TensorFlow实现SVM