簡體   English   中英

使用matplotlib在python中繪制曲線決策邊界

[英]plotting curve decision boundary in python using matplotlib

我是python機器學習的新手。 我設法使用matplotlib繪制了邏輯回歸的直接決策邊界。 但是,在繪制曲線以理解使用某些樣本數據集的過度擬合的情況時,我面臨一些困難。

我正在嘗試使用正則化構建邏輯回歸模型,並使用正則化來控制過度擬合我的數據集。

我知道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') 

下圖給出了我期望的決策邊界:

在此處輸入圖片說明
任何幫助,將不勝感激。

我可以使用以下代碼繪制直接的決策邊界:

# 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)

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

在此處輸入圖片說明

在理想情況下,上述決策邊界很好,但我想繪制一條曲線決策邊界,該邊界將非常適合我的訓練數據,但會過擬合我的測試數據。 與第一幅圖中所示相似

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

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

這是查找初始輪廓的示例:

在此處輸入圖片說明

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM