2017-06-27 75 views
0

我有一個關於代碼被剪掉的問題,我發現我是一本書。 作者創建了兩類採樣點。接下來,作者學習一個模型並將SVC模型繪製到「斑點」上。 這是剪斷代碼:C支持向量分類理解

# create 50 separable points 
X, y = make_blobs(n_samples=50, centers=2, 
        random_state=0, cluster_std=0.60) 

# fit the support vector classifier model 
clf = SVC(kernel='linear') 
clf.fit(X, y) 

# plot the data 
fig, ax = plt.subplots(figsize=(8, 6)) 
point_style = dict(cmap='Paired', s=50) 
ax.scatter(X[:, 0], X[:, 1], c=y, **point_style) 

# format plot 
format_plot(ax, 'Input Data') 
ax.axis([-1, 4, -2, 7]) 


# Get contours describing the model 
xx = np.linspace(-1, 4, 10) 
yy = np.linspace(-2, 7, 10) 
xy1, xy2 = np.meshgrid(xx, yy) 
Z = np.array([clf.decision_function([t]) 
       for t in zip(xy1.flat, xy2.flat)]).reshape(xy1.shape) 

line_style = dict(levels = [-1.0, 0.0, 1.0], 
        linestyles = ['dashed', 'solid', 'dashed'], 
        colors = 'gray', linewidths=1) 

ax.contour(xy1, xy2, Z, **line_style) 

結果如下:

Image 1

我的問題是,現在,我們爲什麼要打造 「XX」 和 「YY」,以及「XY1 「和」xy2「?因爲實際上我們想要顯示X和y數據的SVC「函數」,並且如果我們將xy1和xy2以及Z(也是用xy1和xy2創建的)傳遞給meshgrid函數來繪製meshgrid,則不存在連接SVC模型的數據......不是嗎?

有人可以向我解釋這個或請給出一個建議如何解決這個更容易?

謝謝您的回答

+1

你檢查過'''contour'''的文檔嗎?這是輪廓圖的常用輸入。這些線不是手動繪製的,輪廓在這裏很重要,因此這種設置。 – sascha

+0

@sascha,謝謝。是的,我檢查了輪廓文件。但爲什麼我們分別使用xx和xy xy1和xy2代替X和y?我的意思是xy1和xy2是從以下創建的人造陣列: xx = np.linspace(-1,4,10) yy = np.linspace(-2,7,10) xy1,xy2 = np.meshgrid(xx, yy)但是這個數字與我們從中創建「blob」的數據沒有什麼共同之處。那麼我們爲什麼要使用它們呢? – 2Obe

回答

1

我會用短寬的答案開始。 ax.contour()只是繪製分離超平面及其「平行」平面的一種方式。你當然可以通過計算飛機來繪製它,如this example

爲了回答你最後的問題,在我看來,它已經是一個相對簡單的(用數學和邏輯)和簡單的(編碼)方式繪製你的模型。當你的分離超平面在數學上不易描述時(例如用於非線性分離的多項式和RBF核),如this example,它特別有用。

爲了解決第二個問題和意見,並回答你的第一個問題,是的,你說得對,xxyyxy1xy2Z一切都非常有限連接到您的(模擬斑點)的數據。它們用於繪製超平面來描述你的模型。

這應該回答你的問題。但是請允許我在這裏提供一些更多的細節,以防其他人不熟悉這個話題。您的數據和xxyyxy1xy2之間的唯一連接,Z是:

  1. xxyyxy1xy2樣品周圍的模擬數據的區域。具體而言,以xx爲中心的模擬數據在(-1, 4)yy之間設置限制,設置在(-2, 7)之間的限制。可以通過ax.scatter(xy1, xy2)檢查「meshgrid」。
  2. Z是對「meshgrid」中所有采樣點的計算。它計算從採樣點到分離超平面的歸一化距離。 Z是等高線圖上的等級。

ax.contour然後使用「meshgrid」和Z來繪製輪廓線。這裏有一些關鍵點:

  1. xy1xy2都是2-d指定(X,Y)的表面的座標。他們逐行列出區域中的採樣點。
  2. Z是一個與xy1xy2形狀相同的二維陣列。它定義每個點的等級,以便程序可以「理解」三維曲面的形狀。
  3. levels = [-1.0, 0.0, 1.0]表示在繪製的相應級別有3條曲線(在這種情況下爲線條)。與SVC相關,0級是分離超平面;等級-1和1非常接近(相差ζi)到分離超平面的最大餘量。
  4. linestyles = ['dashed', 'solid', 'dashed']表示將分離超平面繪製爲實線,並將兩側的兩個平面繪製爲虛線。

編輯(在響應評論):

數學,決策函數應該是一個標誌功能,告訴我們一個點爲0級或1,如你所說。但是,當您檢查Z中的值時,您會發現它們是連續的數據。 decision_function(X)的工作方式是,值的符號表示分類,而絕對值是「樣本X到分離超平面的距離」,它反映(種類)預測分類的置信度/顯着性。這對模型的情節至關重要。如果Z是分類的話,你可以得到輪廓線,使得一個區域像一個網格而不是一條輪廓線。它會像the example中的色網那樣;但你不會看到ax.contour(),因爲它不是輪廓圖的正確行爲。

+0

非常感謝。但要完全理解它,對我而言,仍然有一件事缺失。你說:「[...] xx,yy,xy1,xy2和Z都與你的(模擬斑點)數據連接非常有限[...]」。我是對的,即:1.我的數據和超平面之間唯一的「連接」是Z:Z = np.array([clf.decision_function([t]) for zip in zip(xy1.flat,xy2。 flat)])。reshape(xy1.shape) ? 2. Z爲「meshgrid」中的每個點返回該點具有0或1的水平 - > Z可以這樣做,因爲clf「知道」哪個點是0,哪個點是1. – 2Obe

+0

關於你的兩個想法:1)是的,你是對的。 'Z'包含從您的數據中「學習」的超平面的標準化距離。 2)部分正確。我會說'Z'中的值有2個信息,分類和信心。我的解釋對於評論太長了。我把它放在我更新的答案中。 –