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鸢尾花 。散点图为各数据点真实的花类型 , 划分的三个区域为数据点预测的花类型,预测的分类结果与训练数据的真实结果结果基本一致 , 部分鸢尾花出现交叉 。

下面作者对导入数据集后的代码进行详细讲解 。
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_[]函数将其组合成一个二维数组进行预测 。

推荐阅读