在最近學習《機器學習實戰時》,在使用matplotlib時,往往是這樣:import matplotlib.pyplot as plt
接下來fig=plt.figure() 繪制圖表
fig.add_subplot(111)是什么意思呢?
函數是在大的畫布中繪制小畫布,111表明:將畫布分成1行1列,獲取從上到下,從左到右第1塊小畫布。
同理add_subplot(2,3,5)的意思不難理解。如果將畫布分成3行4列要在第10塊畫布作畫怎么寫呢?add_subplot(3,4,10)即可。
繪圖實例:代碼來自《機器學習實戰》
import matplotlib.pyplot as plt dataMat,labelMat=loadDataSet() dataArr=array(dataMat) n=shape(dataArr)[0] x1cord1=[];x2cord1=[]#實際分類為1的樣例,其特征對應值存放處 x1cord2=[];x2cord2=[] for i in range(n): if int(labelMat[i])==1: x1cord1.append(dataArr[i,1]);x2cord1.append(dataArr[i,2]) else: x1cord2.append(dataArr[i,1]);x2cord2.append(dataArr[i,2]) fig=plt.figure() ax=fig.add_subplot(111) ax.scatter(x1cord1,x2cord1,s=30,c='red',marker='s')#scatter用於繪制散點 ax.scatter(x1cord2,x2cord2,s=30,c='green')#至此繪制出了分別屬於兩類的點 x1=arange(-3.0,3.0,0.1)#arange與range函數類似,不過range函數產生的是list,而arange產生的是array。表明產生-0.3到0.3之間的數,步長為0.1 weightsT=array(weights) x2=(-weightsT[0]-weightsT[1]*x1)/weightsT[2]#weights是matrix,進行計算后得到的x2也是matrix,而x1是array,所以需要統一.|x1|==|x2| ax.plot(x1,x2)#調用plot函數繪制得到由點生成的線條 plt.xlabel('X1');plt.ylabel('X2');#為橫縱坐標命名 plt.show()
代碼中xcord的類型可以是列表,也可以是array。好像是這樣,array,list還有matrix的用法需要討論。
為什么:x2=(-weightsT[0]-weightsT[1]*x1)/weightsT[2]。
因為z=w0+w1*x1+w2*x2(在本例中),將z代入sigmoid函數中求值進而分類,觀察sigmoid函數看到自變量為0前后是圖像跳躍的點,如下如sigmoid函數圖:
所以z==0為分隔點,令z=0,得到x1與x2之間的關系。運行代碼:
得到如下圖:
添加flatten函數的用法:
部分內容來自http://blog.csdn.net/maoersong/article/details/23823925
flatten函數可以用在array與matrix上,但是不可用在list上:
1:用在array:
>>> a = [[1,3],[2,4],[3,5]] >>> a = array(a) >>> a.flatten() array([1, 3, 2, 4, 3, 5])
2、用在列表:直接使用報錯
>>> a = [[1,3],[2,4],[3,5]] >>> a.flatten() Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> a.flatten() AttributeError: 'list' object has no attribute 'flatten'
如下為正確用法:
>>> a = [[1,3],[2,4],[3,5],["abc","def"]] >>> a1 = [y for x in a for y in x] >>> a1 [1, 3, 2, 4, 3, 5, 'abc', 'def']
3、用在矩陣:
>>> a = [[1,3],[2,4],[3,5]] >>> a = mat(a) >>> y = a.flatten() >>> y matrix([[1, 3, 2, 4, 3, 5]]) >>> y = a.flatten().A >>> y array([[1, 3, 2, 4, 3, 5]]) >>> shape(y) (1, 6) >>> shape(y[0]) (6,) >>> y = a.flatten().A[0] >>> y array([1, 3, 2, 4, 3, 5])
在繪制圖像,需要部分數據時,可以首先獲取需要的矩陣中的一列數,然后通過調用flatten函數轉成單行矩陣,再調用.A,獲取二維array形式,獲取下標為0的元素。此時得到單維array形式,可以在ax.scatter中作為參數,繪制圖形。
得到圖形如下: