前面使用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_[]函数将其组合成一个二维数组进行预测 。
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主题 , 输出区域如下图所示:
推荐阅读
- 删档内测充了钱怎么办
- 拍拍贷借款在审核中是借到款了吗?
- 梦见家里养了一只白色的小狗 梦见家里养白色猫
- 2015我被广东医学院大学录取了,怎么查询自己在哪个校区
- 脸上痘痘抠破了怎么办 脸上痘痘怎么办啊
- 为什么我的电脑连接不了宽带,为什么座机好用电脑连不上网呢?
- 写教师节到了600字初中作文
- 开关贴纸 开关贴
- 单身者梦见别人把自己打了
- 解决电脑开不了机的思路方法 电脑开不了机了怎么办