第1关:Python绘图基础
samples=int(input())
random_state=int(input())
data=make_regression(n_samples=samples, random_state=random_state)
X, y=data
X=np.mean(X, axis=1)
plt.scatter(X,y)
第2关:将分类数据集可视化
samples=int(input())
random_state=int(input())
data=make_blobs(n_samples=samples, n_features =4, random_state=random_state)
X, y=data
plt.subplot(231)
plt.scatter(X[:,0],X[:,1],c=y)#y不是yellow,是前面生成的标签值数组y,cmap="viridis"默认值
plt.subplot(232)
plt.scatter(X[:,0],X[:,2],c=y)
plt.subplot(233)
plt.scatter(X[:,0],X[:,3],c=y)
plt.subplot(234)
plt.scatter(X[:,1],X[:,2],c=y)
plt.subplot(235)
plt.scatter(X[:,1],X[:,3],c=y)
plt.subplot(236)
plt.scatter(X[:,2],X[:,3],c=y)
第3关:分类器模型可视化
samples=int(input())
random_state=int(input())
#X为特征数组,y为标签数组
X, y=make_blobs(n_samples=samples, centers=2, random_state=random_state)
#创建并训练分类器
clf=KNeighborsClassifier()
clf.fit(X, y)
#获取所有数据点中的横轴坐标与纵轴坐标的最大值和最小值
x_min, x_max=X[:,0].min()-1, X[:,0].max()+1
y_min, y_max=X[:,1].min()-1, X[:,1].max()+1 #注释1(解释在下面)
#使用np.meshgrid()方法生成网格坐标矩阵。用于后面绘制一片区域。
xx,yy=np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
#对于网格坐标矩阵中的每个网格点,使用分类器预测其取值
z=clf.predict(np.c_[xx.ravel(), yy.ravel()]) #注释2
z=z.reshape(xx.shape) #注释3
#使用pyplot.pcolormesh()对每个小网格进行绘制。绘制区域
plt.pcolormesh(xx,yy,z)
plt.scatter(X[:,0],X[:,1],c=y, edgecolor='k')#k有引号
#使用pyplot.xlim(),pyplot.ylim()方法限定可视区域。绘制边界。
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
注释1加减一
这里的加1减1,是为了确保网格的范围稍微超出数据点的实际范围。这样产生的xx,yy,在绘制区域,和最后限定可视区域也能更大一些。绘图更清晰。
注释2`np.c_`
是 NumPy 库中的一个快捷方式,用于沿第二个轴(列)堆叠数组。它提供了一种简洁的方法来连接数组,类似于 `np.column_stack`。`np.c_` 提供了便捷的语法,特别是在交互式环境中。使用 `np.c_` 时,只需将要堆叠的数组作为参数传递给它。
需要注意的是,`np.c_` 是按行连接两个矩阵,即把两个矩阵左右相加,要求行数相等。这与 `np.r_` 不同,`np.r_` 是按列连接两个矩阵,即把两个矩阵上下相加,要求列数相等。这种连接方式类似于 pandas 中的 `merge()` 函数。
注释2`ravel()`
在NumPy中,`ravel()`是一个用于将多维数组转换为一维数组的函数。这个函数会返回输入数组的扁平化(flattened)版本,即将多维数组的所有元素按照行优先的顺序排列成一个一维数组。
上文中,`xx.ravel()`和`yy.ravel()`被用于将网格坐标矩阵`xx`和`yy`转换为一维数组,这样它们就可以被传递给`clf.predict()`函数作为输入。`clf.predict()`函数期望的输入是一个二维数组,其中每一行都是一个数据点的特征值。由于`xx`和`yy`是通过`np.meshgrid()`生成的,它们是二维数组,但它们的形状与通常的数据集不同。通过调用`ravel()`,我们能够将它们转换为一个长的一维数组,其中包含了网格上所有点的坐标。
例如,假设`xx`是一个形状为`(m, n)`的二维数组,那么`xx.ravel()`将返回一个形状为`(m*n,)`的一维数组。这样,当我们将`xx.ravel()`和`yy.ravel()`的结果组合起来形成一个新的二维数组(使用`np.c_[xx.ravel(), yy.ravel()]`)时,我们就可以得到一个形状为`(m*n, 2)`的数组,其中每一行都对应网格上的一个点,并包含该点的x和y坐标。
注释3reshape
z=z.reshape(xx.shape) 将z重塑成xx一样的二维数组。
因为pyplot.pcolormesh()
最常使用到的三个参数为X
, Y
以及C
,其中X
和Y
为待绘制区域的坐标矩阵。而C
则为一个代表每个区域所需的颜色的矩阵,它的形状与X(xx)
和Y(yy)
一样。