2015-05-04 227 views
0

我是使用python進行機器學習的新手。我設法使用matplotlib繪製了邏輯迴歸的直線決策邊界。但是,在繪製曲線時,我很難理解使用某些樣本數據集過度擬合的情況。使用matplotlib在Python中繪製曲線決策邊界

我想建立一個邏輯迴歸模型使用正則化和使用正則化來控制過度擬合我的數據集。

我知道sklearn庫的,但是我寧願寫代碼分開

我工作的測試數據樣本下面給出:

x=np.matrix('2,300;4,600;7,300;5,500;5,400;6,400;3,400;4,500;1,200;3,400;7,700;3,550;2.5,650') 
y=np.matrix('0;1;1;1;0;1;0;0;0;0;1;1;0') 

我期待的決策邊界中給出如下圖:

enter image description here
任何幫助,將不勝感激。

# plot of x 2D 
plt.figure() 
pos=np.where(y==1) 
neg=np.where(y==0) 

plt.plot(X[pos[0],0], X[pos[0],1], 'ro') 
plt.plot(X[neg[0],0], X[neg[0],1], 'bo') 
plt.xlim([min(X[:,0]),max(X[:,0])]) 
plt.ylim([min(X[:,1]),max(X[:,1])]) 
plt.show() 

# plot of the decision boundary 
plt.figure() 
pos=np.where(y==1) 
neg=np.where(y==0) 

plt.plot(x[pos[0],1], x[pos[0],2], 'ro') 
plt.plot(x[neg[0],1], x[neg[0],2], 'bo') 
plt.xlim([x[:, 1].min()-2 , x[:, 1].max()+2]) 
plt.ylim([x[:, 2].min()-2 , x[:, 2].max()+2]) 


plot_x = [min(x[:,1])-2, max(x[:,1])+2] # Takes a lerger decision line 

plot_y = (-1/theta_NM[2])*(theta_NM[1]*plot_x +theta_NM[0]) 
plt.plot(plot_x, plot_y) 

我的決策邊界看起來是這樣的:

enter image description here

在理想的情況下上面的決策邊界是好的

我可以使用下面的代碼繪製一條直線決策邊界但我想繪製一個曲線決策邊界,它能非常好地適合我的訓練數據,但會過多地適合我的測試數據。類似於第一張圖所示的東西

+0

什麼是你的問題/問題?你有什麼嘗試? –

+0

嗨julien,我試圖建立一個曲線決定邊界,我試圖用matplotlib繪製一條直線。但我不知道如何繪製matplotlib中的曲線。我嘗試了曲線的多項式特徵。我對我的問題做了一些更新。請看看..謝謝:) – Sam

+0

你不能簡單地使用藍點的最大包絡線和紅點的最小包絡線之間的平均值嗎? (雖然不確定在原始圖中丟失紅點(x <3)和丟失藍點(x> 5))做什麼 –

回答

2

這可以通過網格化參數空間並將每個網格點設置爲最近點的值來完成。然後在這個網格上運行一個等高線圖。

但有很多變化,例如將其設置爲距離加權平均值;或平滑最終輪廓;等

這裏尋找初始輪廓的一個例子:

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 

# get the data as numpy arrays 
xys = np.array(np.matrix('2,300;4,600;7,300;5,500;5,400;6,400;3,400;4,500;1,200;3,400;7,700;3,550;2.5,650')) 
vals = np.array(np.matrix('0;1;1;1;0;1;0;0;0;0;1;1;0'))[:,0] 
N = len(vals) 

# some basic spatial stuff 
xs = np.linspace(min(xys[:,0])-2, max(xys[:,0])+1, 10) 
ys = np.linspace(min(xys[:,1])-100, max(xys[:,1])+100, 10) 
xr = max(xys[:,0]) - min(xys[:,0]) # ranges so distances can weight x and y equally 
yr = max(xys[:,1]) - min(xys[:,1]) 
X, Y = np.meshgrid(xs, ys) # meshgrid for contour and distance calcs 

# set each gridpoint to the value of the closest data point: 
Z = np.zeros((len(xs), len(ys), N)) 
for n in range(N): 
    Z[:,:,n] = ((X-xys[n,0])/xr)**2 + ((Y-xys[n,1])/yr)**2 # stack arrays of distances to each points 
z = np.argmin(Z, axis=2) # which data point is the closest to each grid point 
v = vals[z]    # set the grid value to the data point value 

# do the contour plot (use only the level 0.5 since values are 0 and 1) 
plt.contour(X, Y, v, cmap=plt.cm.gray, levels=[.5]) # contour the data point values 

# now plot the data points 
pos=np.where(vals==1) 
neg=np.where(vals==0) 

plt.plot(xys[pos,0], xys[pos,1], 'ro') 
plt.plot(xys[neg,0], xys[neg,1], 'bo') 

plt.show()