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


本篇主要總結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

 

 

轉載請注明出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM