tensorflow實現支持向量機
支持向量機用於二分類問題。對要分類的數據,找到一個線形可分的直線或平面。
超平面的公式為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()
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_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實現支持向量機