1. 程式人生 > >tensorflow實現支持向量機

tensorflow實現支持向量機

size end des lac clas del p s 加載 optimize

支持向量機用於二分類問題。對要分類的數據,找到一個線形可分的直線或平面。

超平面的公式為Ax-b=0

對於損失函數,我們的公式為

1/n∑ni=1 max(0,1-yi(Axi-b))+a||A||2

由公式可知,分類正確時,損失函數只取決於a值

#引入相關的庫

import numpy as np

import tensorflow as tf
from sklearn import datasets

#設置參數,支持新版的API

import os
os.environ[‘TF_CPP_MIN_LOG_LEVEL‘] = ‘2‘

#加載數據集

iris=datasets.load_iris()

x_vals=np.array([[x[0],x[3]] for x in iris.data])
y_vals=np.array([1 if y==0 else -1 for y in iris.target])

#分割數據集
train_indices=np.random.choice(len(x_vals),round(len(x_vals)*0.8),replace=False)
test_indices=np.array(list(set(range(len(x_vals)))-set(train_indices)))
x_vals_train=x_vals[train_indices]
x_vals_test=x_vals[test_indices]

y_vals_train=y_vals[train_indices]
y_vals_test=y_vals[test_indices]

#設置圖
sess=tf.Session()

#設置圖參數
batch_size=100
x_data=tf.placeholder(shape=[None,2],dtype=tf.float32)
y_target=tf.placeholder(shape=[None,1],dtype=tf.float32)

A=tf.Variable(tf.random_normal(shape=[2,1]))
b=tf.Variable(tf.random_normal(shape=[1,1]))

#設置模型
model_output=tf.subtract(tf.matmul(x_data,A),b)

#設置損失函數
l2_norm=tf.reduce_sum(tf.square(A))
alpha=tf.constant([0.1])
classification_term=tf.reduce_mean(tf.maximum(0.0,tf.subtract(1.0,tf.multiply(model_output,y_target))))
loss=tf.add(classification_term,tf.multiply(alpha,l2_norm))

#聲明預測函數
prediction=tf.sign(model_output)

#聲明準確度函數
accuracy=tf.reduce_mean(tf.cast(tf.equal(prediction,y_target),tf.float32))

#聲明優化器函數
my_opt=tf.train.GradientDescentOptimizer(0.01)
train_step=my_opt.minimize(loss)

init=tf.global_variables_initializer()
sess.run(init)

loss_vec=[]
train_accuracy=[]
test_accuracy=[]
for i in range(500):
rand_index=np.random.choice(len(x_vals_train),size=batch_size)
rand_x=x_vals_train[rand_index]
rand_y=np.transpose([y_vals_train[rand_index]])
sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y})

temp_loss=sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})
loss_vec.append(temp_loss)

train_acc_temp=sess.run(accuracy,feed_dict={x_data:x_vals_train,y_target:np.transpose([y_vals_train])})
train_accuracy.append(train_acc_temp)

test_acc_temp=sess.run(accuracy,feed_dict={x_data:x_vals_test,y_target:np.transpose([y_vals_test])})
test_accuracy.append(test_acc_temp)

print(train_accuracy)
print(test_accuracy)

tensorflow實現支持向量機