支持向量机用于二分类问题。对要分类的数据,找到一个线形可分的直线或平面。
超平面的公式为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)
原文:https://www.cnblogs.com/bladeyul/p/10545028.html