在做支援向量機決策邊界繪制時,或多或少都會遇到這兩個問題。
1.當我們将兩個一維數組傳入np.meshgrid()後,它的内部是怎麼實作的?
2.當我們準備好的資料放入plt.contour()後,他是如何繪制等高線的?
在這過程中我們用到兩個包:
import matplotlib.pyplot as plt
import numpy as np
準備資料:
x = np.linspace(-2, 2, 5)
y = np.linspace(-2, 2, 5)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2 - 1
接下來我們看一下,np.meshgrid()将我們的x, y轉成什麼樣的網格了。
資料如下:
x: [-2. -1. 0. 1. 2.]
y: [-2. -1. 0. 1. 2.]
網格資料X.shape為(5, 5),資料内容如下:
[[-2. -1. 0. 1. 2.]
[-2. -1. 0. 1. 2.]
[-2. -1. 0. 1. 2.]
[-2. -1. 0. 1. 2.]
[-2. -1. 0. 1. 2.]]
網格資料Y.shape為(5, 5),資料内容如下:
[[-2. -2. -2. -2. -2.]
[-1. -1. -1. -1. -1.]
[ 0. 0. 0. 0. 0.]
[ 1. 1. 1. 1. 1.]
[ 2. 2. 2. 2. 2.]]
通過觀察我們發下,經過X, Y = np.meshgrid(x, y)操作,它将我們的x資料縱向複制了5份,而将Y 轉置之後橫向複制了5份。那麼它複制的個數5是按照自己的長度呢?還是另一個坐标的數結構呢?通過下面例子可知:
x = [1, 2]
y = [3, 4, 5]
X, Y = np.meshgrid(x, y)
print(X)
print(Y)
控制台輸出:
[[1 2]
[1 2]
[1 2]]
[[3 3]
[4 4]
[5 5]]
另一個問題,這樣做是什麼原理?既然說np.meshgrid()做出來的資料是網格資料,那麼我們将X, Y 繪制出來看看:
plt.figure(figsize=(6, 4))
ax1 = plt.gca()
ax2 = plt.gca()
ax1.vlines(x=X, ymin=Y[0], ymax=Y[4], colors='r', linestyles='-.', linewidth=0.5)
ax2.hlines(y=X, xmin=Y[0], xmax=Y[4], colors='g', linestyles='-.', linewidth=0.5)
plt.scatter(X, Y)
我們分别單獨觀察X,Y以及X,Y的組合圖:

上圖即是x: [-2. -1. 0. 1. 2.]資料縱向複制5份的效果即為X。
上圖即是y: [-2. -1. 0. 1. 2.]資料轉置後橫向複制5份的效果即為Y。
下面是X, Y 的組合效果:
我們發下,np.meshgrid()真的将我們的x, y資料做成了網格。而X, Y矩陣對應位置的資料就是圖中相應位置點的坐标。而且,網格形狀也是(5 x 5)。
接下來我們談談等高線。什麼是等高線:把地面上海拔高度相同的點連成的閉合曲線,并垂直投影到一個水準面上,并按比例縮繪在圖紙上,就得到等高線。一句話說就是再一個平面上将使得Z = f(x, y)的Z值相等的衆多坐标點(注意:不止一個坐标點,這一點後邊會有所展現。)相連即為高度值為Z的等高線。
OK,上述生成的網格那麼優美,我們必須得搭配一個更優美的曲線x^2 + y^2= 1 來做我們的等高線喽。即Z = f(x, y) = x^2 + y^2 - 1。
将我們的X, Y帶入f(X, Y)得到Z形式也是(5x5),資料如下:
[[ 7. 4. 3. 4. 7.]
[ 4. 1. 0. 1. 4.]
[ 3. 0. -1. 0. 3.]
[ 4. 1. 0. 1. 4.]
[ 7. 4. 3. 4. 7.]]
如果仔細觀察,你會發現Z的形狀與X,Y的形狀相同,更更更重要的是,Z的形狀與我們的網格圖相對應(不是噎住了, 為了強調這種對應關系對生成等高線的重要性)!
接下來呢?上代碼+圖,生成我們的等高線:
ax = plt.gca()
cor = ax.contour(X, Y, Z, [-1, 0, 1, 3])
plt.clabel(cor, fontsize=10)
plt.show()
生成圖:
最後,但不是最不重要的是:我們指出讓在 [-1, 0, 1, 3]四個等高線上下标簽,但是-1沒有被寫出來???
如果我們隻寫[-1],會出現如下警告:
UserWarning: No contour levels were found within the data range.
cor = ax.contour(X, Y, Z, [-1])
此處,與前面某處呼應,即隻有不止一個點帶入f(x, y)中有相同值時,等高線才産生!
OK,Class is over.