如何用Python生成带三类标签的三层嵌套同心圆数据集
Python生成三层嵌套同心圆数据集解决方案
你可以通过极坐标自定义生成的方式实现三层同心圆,该方案灵活度更高,可自由调整每个圈层的半径、噪声大小和样本数量,完整可运行代码如下:
import numpy as np import matplotlib.pyplot as plt def make_three_circles(n_samples_per_class=200, noise=0.05, radii=[3, 2, 1]): # radii参数按从外到内的顺序对应class0、class1、class2的圈层半径 X = [] y = [] for class_id, r in enumerate(radii): # 随机生成0到2π的极角 theta = np.random.uniform(0, 2 * np.pi, n_samples_per_class) # 为半径添加高斯噪声,让圈层更自然 r_noisy = r + np.random.normal(0, noise, n_samples_per_class) # 极坐标转换为笛卡尔坐标 x_axis = r_noisy * np.cos(theta) y_axis = r_noisy * np.sin(theta) X.append(np.column_stack((x_axis, y_axis))) y.append(np.full(n_samples_per_class, class_id)) # 合并所有样本和对应标签 X = np.vstack(X) y = np.hstack(y) return X, y # 生成数据集 X, y = make_three_circles() # 可视化效果 plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', marker='o', facecolors='none', s=50) plt.axis('equal') plt.show()
参数说明
n_samples_per_class:每个圈层对应的样本数量,可根据需求自定义noise:控制样本点的离散程度,数值越大圈层边缘越不规则radii:三个圈层的半径值,按从外到内的顺序设置即可
如果你想基于sklearn现有接口实现,也可以通过两次调用make_circles后拼接数据集实现:
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_circles # 生成外层(class0)和中间层(class1)样本 X_outer_mid, y_outer_mid = make_circles(n_samples=400, noise=0.05, factor=0.6) # 生成内层(class2)样本 X_mid_inner, y_mid_inner = make_circles(n_samples=200, noise=0.05, factor=0.6) X_inner = X_mid_inner[y_mid_inner==1] * 0.6 y_inner = np.full(len(X_inner), 2) # 合并所有样本和标签 X = np.vstack([X_outer_mid, X_inner]) y = np.hstack([y_outer_mid, y_inner]) # 可视化 plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', marker='o', facecolors='none', s=50) plt.axis('equal') plt.show()
注:你原代码中导入
pylab as pl但调用时使用plt属于变量名不匹配,上述代码统一使用官方更推荐的matplotlib.pyplot导入方式。
内容的提问来源于stack exchange,提问作者Ytt
相关产品推荐
相关产品推荐

