【機器學習】tensorflow: GPU求解帶核函式的SVM二分類支援向量機
阿新 • • 發佈:2019-01-08
SVM本身是一個最優化問題,因此理所當然可以用簡單的最優化方法來求解,比如SGD。2007年pegasos就發表了一篇文章講述簡單的求解SVM最優化的問題。其求解形式簡單,但是並沒有解決核函式計算量巨大的問題。這裡給出了一個tensorflow的帶核函式的SVM的解法,使用GPU加速,並且支援線上學習。
pegasos給出的優化公式如下:
我用rbf核函式來試驗一下。其中資料以半徑為10的圓圈分割成兩個部分。tensorflow程式碼如下:
sigma = 0 .5
kkx = np.square(np.tile(x[:,0].T,[x.shape[0],1])-np.tile(x[:,0],[1,x.shape[0]]))
#print(kkx)
kkx += np.square(np.tile(x[:,1].T,[x.shape[0],1])-np.tile(x[:,1],[1,x.shape[0]]))
kkx = np.sqrt(kkx)
kkx = np.exp(-sigma * kkx )
lam = 1./2.
batch = x.shape[0]
with tf.device('/gpu:0'):#使用GPU計算
alpha = tf.Variable(tf.random_uniform([batch,1 ],-1.0,1.0))
alpha = tf.maximum(0.,alpha)
KX = tf.placeholder("float", shape=[batch,batch])
y = tf.placeholder("float", shape=[batch,1])
loss = lam*tf.reduce_sum(tf.matmul(alpha,tf.transpose(alpha))*KX)
tmp = tf.matmul(KX, alpha)
tmp = y*tmp
tmp = 1. - tmp
tmp = tf.maximum(0 .,tmp)
tmp = 1./batch*tf.reduce_sum(tmp)
loss += tmp
optimizer = tf.train.GradientDescentOptimizer(0.0002)
train_op = optimizer.minimize(loss)
為了簡化,KX直接用numpy計算好
resA = sess.run(alpha)
predict=np.multiply(resA,x[:,2])
#print(predict.shape)
predict=np.sum(np.multiply(predict,kkx),axis=0)
predict = predict.T
predict=np.tile(predict,[1,3])
#print(predict>0.0)
ax = np.array(x)
predictSet1=ax[predict>0.0].reshape([-1,3])
predictSet2=ax[predict<0.0].reshape([-1,3])
fig = plt.figure()
ax = fig.add_subplot(211)
ax.scatter(x=data1[:,0],y=data1[:,1])
ax.scatter(x=data2[:,0],y=data2[:,1])
ax = fig.add_subplot(212)
ax.scatter(x=predictSet1[:,0],y=predictSet1[:,1])
ax.scatter(x=predictSet2[:,0],y=predictSet2[:,1])
fig.show()
得到影象如下:
上圖是原始資料集,下圖是預測集。可以看出來,tensorflow能夠優化求解svm,比較萬金油。