by28777換哪了 by28777( 八 )


前面使用X=[x[0] for x in DD]獲取之一列數據 , Y=[x[1] for x in DD]獲取第二列數據 , 這里采用另一種 ***  , iris.data[:, :2]獲取其中兩列數據或兩個特征 , 完整代碼如下:
# -*- coding: utf-8 -*-# By:Eastmount CSDN 2021-07-03import matplotlib.pyplot as pltimport numpy as npfrom sklearn.datasets import load_irisfrom sklearn.linear_model import LogisticRegression#載入數據集iris = load_iris()X = X = iris.data[:, :2] #獲取花卉兩列數據集Y = iris.target#邏輯回歸模型lr = LogisticRegression(C=1e5)lr.fit(X,Y)#meshgrid函數生成兩個網格矩陣h = .02x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))#pcolormesh函數將xx,yy兩個網格矩陣和對應的預測結果Z繪制在圖片上Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.figure(1, figsize=(8,6))plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)#繪制散點圖plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa')plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker='x', label='versicolor')plt.scatter(X[100:,0], X[100:,1], color='green', marker='s', label='Virginica')plt.xlabel('Sepal length')plt.ylabel('Sepal width')plt.xlim(xx.min(), xx.max())plt.ylim(yy.min(), yy.max())plt.xticks(())plt.yticks(())plt.legend(loc=2)plt.show()
輸出如圖13所示 。經過邏輯回歸后劃分為三個區域 , 左上角部分為紅色的圓點 , 對應setosa鳶尾花;右上角部分為綠色方塊 , 對應virginica鳶尾花;中間下部分為藍色星形 , 對應versicolor鳶尾花 。散點圖為各數據點真實的花類型 , 劃分的三個區域為數據點預測的花類型 , 預測的分類結果與訓練數據的真實結果結果基本一致 , 部分鳶尾花出現交叉 。

by28777換哪了  by28777

文章插圖
下面作者對導入數據集后的代碼進行詳細講解 。
lr = LogisticRegression(C=1e5)初始化邏輯回歸模型 , C=1e5表示目標函數 。
lr.fit(X,Y)調用邏輯回歸模型進行訓練 , 參數X為數據特征 , 參數Y為數據類標 。
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))獲取鳶尾花數據集的兩列數據 , 對應為花萼長度和花萼寬度 , 每個點的坐標就是(x,y) 。先取X二維數組的之一列(長度)的最小值、更大值和步長h(設置為0.02)生成數組 , 再取X二維數組的第二列(寬度)的最小值、更大值和步長h生成數組 ,  最后用meshgrid函數生成兩個網格矩陣xx和yy , 如下所示:
[[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ][ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]...,[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ][ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]][[ 1.5 1.5 1.5 ..., 1.5 1.5 1.5 ][ 1.52 1.52 1.52 ..., 1.52 1.52 1.52]...,[ 4.88 4.88 4.88 ..., 4.88 4.88 4.88][ 4.9 4.9 4.9 ..., 4.9 4.9 4.9 ]]
Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])調用ravel()函數將xx和yy的兩個矩陣轉變成一維數組 , 由于兩個矩陣大小相等 , 因此兩個一維數組大小也相等 。np.c_[xx.ravel(), yy.ravel()]是獲取并合并成矩陣 , 即:
xx.ravel()[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]yy.ravel()[ 1.5 1.5 1.5 ..., 4.9 4.9 4.9]np.c_[xx.ravel(), yy.ravel()][[ 3.8 1.5 ][ 3.82 1.5 ][ 3.84 1.5 ]...,[ 8.36 4.9 ][ 8.38 4.9 ][ 8.4 4.9 ]]
總之 , 上述操作是把之一列花萼長度數據按h取等分作為行 , 并復制多行得到xx網格矩陣;再把第二列花萼寬度數據按h取等分作為列 , 并復制多列得到yy網格矩陣;最后將xx和yy矩陣都變成兩個一維數組 , 再調用np.c_[]函數將其組合成一個二維數組進行預測 。
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])調用predict()函數進行預測 , 預測結果賦值給Z 。即:
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])[1 1 1 ..., 2 2 2]size: 39501
Z = Z.reshape(xx.shape)調用reshape()函數修改形狀 , 將Z變量轉換為兩個特征(長度和寬度) , 則39501個數據轉換為171*231的矩陣 。Z = Z.reshape(xx.shape)輸出如下:
[[1 1 1 ..., 2 2 2][1 1 1 ..., 2 2 2][0 1 1 ..., 2 2 2]...,[0 0 0 ..., 2 2 2][0 0 0 ..., 2 2 2][0 0 0 ..., 2 2 2]]
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)調用pcolormesh()函數將xx、yy兩個網格矩陣和對應的預測結果Z繪制在圖片上 , 可以發現輸出為三個顏 *** 塊 , 分布表示分類的三類區域 。cmap=plt.cm.Paired表示繪圖樣式選擇Paired主題 , 輸出區域如下圖所示:

推薦閱讀