使用使用tensorflow实现线性实现线性svm
本文实例为大家分享了tensorflow实现线性svm的具体代码,供大家参考,具体内容如下
简单方法:
import tensorflow as tf
import numpy as np
from matplotlib import pyplot as plt
def placeholder_input():
x=tf.placeholder('float',shape=[None,2],name='x_batch')
y=tf.placeholder('float',shape=[None,1],name='y_batch')
return x,y
def get_base(_nx, _ny):
_xf = np.linspace(x_min, x_max, _nx)
_yf = np.linspace(y_min, y_max, _ny)
xf1, yf1 = np.meshgrid(_xf, _yf)
n_xf,n_yf=np.hstack((xf1)),np.hstack((yf1))
return _xf, _yf,np.c_[n_xf.ravel(), n_yf.ravel()] x_data=np.load('x.npy')
y1=np.load('y.npy')
y_data=np.reshape(y1,[200,1])
step=10000
tol=1e-3
x,y=placeholder_input()
w = tf.Variable(np.ones([2,1]), dtype=tf.float32, name="w_v")
b = tf.Variable(0., dtype=tf.float32, name="b_v")
y_pred =tf.matmul(x,w)+b
y_predict =tf.sign( tf.matmul(x,w)+b )
# cost = ∑_(i=1)^N max(1-y_i⋅(w⋅x_i+b),0)+1/2 + 0.5 * ‖w‖^2
cost = tf.nn.l2_loss(w)+tf.reduce_sum(tf.maximum(1-y*y_pred,0))
train_step = tf.train.AdamOptimizer(0.01).minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(step):
sess.run(train_step,feed_dict={x:x_data,y:y_data})
y_p,y_p1,loss,w_value,b_value=sess.run([y_predict,y_pred,cost,w,b],feed_dict={x:x_data,y:y_data})
x_min, y_min = np.minimum.reduce(x_data,axis=0) -2
x_max, y_max = np.maximum.reduce(x_data,axis=0) +2
xf, yf , matrix_= get_base(200, 200)
#xy_xf, xy_yf = np.meshgrid(xf, yf, sparse=True)
z=np.sign(np.matmul(matrix_,w_value)+b_value).reshape((200,200))
plt.pcolormesh(xf, yf, z, cmap=plt.cm.Paired)
for i in range(200):
if y_p[i,0]==1.0:
plt.scatter(x_data[i,0],x_data[i,1],color='r')
else:
plt.scatter(x_data[i,0],x_data[i,1],color='g')
plt.axis([x_min,x_max,y_min ,y_max])
#plt.contour(xf, yf, z)
plt.show()
进阶: