1. 程式人生 > >【機器學習】tensorflow: GPU求解帶核函式的SVM二分類支援向量機

【機器學習】tensorflow: GPU求解帶核函式的SVM二分類支援向量機

SVM本身是一個最優化問題,因此理所當然可以用簡單的最優化方法來求解,比如SGD。2007年pegasos就發表了一篇文章講述簡單的求解SVM最優化的問題。其求解形式簡單,但是並沒有解決核函式計算量巨大的問題。這裡給出了一個tensorflow的帶核函式的SVM的解法,使用GPU加速,並且支援線上學習。
pegasos給出的優化公式如下:

argminλ2i,jαiαjK(xi,xj)+1Nimax{0,1yijαjK(xi,xj)},α0predict:y=αiyiK(x,xi)
我用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計算好K(xi,xj)之後傳入。經過優化後,我們取出α,這裡我不去掉0,就直接套用在原來的資料上進行預測:

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,比較萬金油。