1. 程式人生 > >tensorflow 邏輯回歸之解決欠擬合問題(一)

tensorflow 邏輯回歸之解決欠擬合問題(一)

init eps 簡單 ack 進行 dict 測試 vmax legend

本篇主要總結1.二分類邏輯回歸簡單介紹 , 2.算法的實現 3.對欠擬合問題的解決方法及實現(第二部分)

1.邏輯回歸

邏輯回歸主要用於非線性分類問題。具體思路是首先對特征向量進行權重分配之後用 sigmoid 函數激活。如下公式(1)(2) :

技術分享圖片

h > 0.5時,分類為1。h < 0.5時分類為0。

損失函數:如下公式(3):

技術分享圖片

梯度下降公式如下公式(4)(推導過程略):

技術分享圖片

2.tensorflow 實現,代碼如下:

 1 # coding:utf-8
 2 import tensorflow as tf
 3 import matplotlib.pyplot as plt
4 import numpy as np 5 6 data=[] 7 label=[] 8 np.random.seed(0) 9 10 ##隨機產生訓練集 11 for i in range(500): 12 x1=np.random.uniform(-1,1) 13 x2=np.random.uniform(0,2) 14 if x1**2+ x2**2<=1: 15 data.append([np.random.normal(x1,0.1),np.random.normal(x2,0.1)]) 16 label.append(0)
17 else: 18 data.append([np.random.normal(x1,0.1),np.random.normal(x2,0.1)]) 19 label.append(1) 20 21 data=np.hstack(data).reshape(-1,2) 22 label=np.hstack(label).reshape(-1,1) 23 plt.scatter(data[ :,0], data[ :, 1], c=np.squeeze(label), cmap="RdBu", vmin=-.2, vmax=1.2, edgecolor="white
") 24 plt.show() 25 #定義訓練集測試集 26 num_trian = int(0.7*len(data)) 27 train_data = data[:num_trian,:] 28 train_label = label[:num_trian,:] 29 test_data = data[num_trian:,:] 30 test_label = label[num_trian:,:] 31 32 #定義參數 33 learningrate = 0.05 34 num_epotchs = 50000 35 w = tf.Variable(tf.random_normal([2,1], mean = 0.0, stddev = 1.0), name="w", trainable=True) 36 b = tf.Variable(tf.random_normal([1], mean = 0.0, stddev = 1.0), name = b, trainable = True) 37 38 #構造輸入輸出門 39 x=tf.placeholder(tf.float32,shape=(None,2)) 40 y=tf.placeholder(tf.float32,shape=(None,1)) 41 sample_size=len(data) 42 #邏輯回歸模型 43 y_logistic = tf.sigmoid(tf.add(tf.matmul(x,w),b)) 44 cost = tf.reduce_mean(-y*(tf.log(y_logistic))-(1-y)*(tf.log(1-y_logistic))) 45 train_op = tf.train.GradientDescentOptimizer(learningrate).minimize(cost) 46 47 error = [] 48 initial = tf.global_variables_initializer() 49 with tf.Session() as sess: 50 #初始化全局變量 51 sess.run(initial) 52 #開始訓練 53 for epotch in range(num_epotchs): 54 err,_ = sess.run([cost,train_op],feed_dict = {x : train_data, y :train_label}) 55 if epotch % 500 == 0: 56 print(after %d steps ,error is %.3f%(epotch,err)) 57 error.append(err) 58 59 xx,yy= np.mgrid[-1.2:1.2:.01,-0.2:2.2:.01] 60 #合並兩個數組 61 grid=np.c_[xx.ravel(),yy.ravel()] 62 probs=sess.run(y_logistic,feed_dict={x:grid}) 63 plt.plot(error, label = "cost") 64 plt.legend() 65 plt.show() 66 probs=probs.reshape(xx.shape) 67 #可視化檢驗數據集 68 plt.scatter(test_data[ :,0], test_data[ :, 1], c=np.squeeze(test_label), cmap="RdBu", vmin=-.2, vmax=1.2, edgecolor="white") 69 #用h = 0.5等高線畫出分類邊界,查看分類效果 70 plt.contour(xx,yy,probs,levels=[.5],cmap="Greys",vmin=0,vmax=.1) 71 plt.show()

實現之後,結果如下圖(1)。可以看到,分類結果不是很理想,沒有很好地做到非線性擬合。這裏面涉及到特征維度不足的問題。在第二部分中講解解決方法。

技術分享圖片

圖1

轉載請註明出處

tensorflow 邏輯回歸之解決欠擬合問題(一)