如何用Python绘制三个圆形数据集?sklearn make_circles问题求助
生成三个同心圆散点图的解决方案
make_circles函数本身只能生成两组同心圆数据,所以要得到三个圆,需要手动组合多组数据或者自行生成第三组数据。下面提供两种可行的方法:
方法一:多次调用make_circles合并数据
通过两次调用make_circles,分别生成不同半径比例的圆数据,然后将第三组数据合并进去。注意你原代码里的factor=0是错误的——这个参数控制内圈与外圈的半径比例,取值范围是(0,1),设为0会导致内圈缩成一个点,先修正这个问题。
示例代码:
from sklearn.datasets import make_circles import matplotlib.pyplot as plt import numpy as np # 第一次调用:生成外圈(标签0)和中圈(标签1) X1, y1 = make_circles(n_samples=2000, noise=0.1, factor=0.5, random_state=42) # 第二次调用:生成中圈(标签0)和内圈(标签1),只取内圈数据 X2, y2 = make_circles(n_samples=1609, noise=0.1, factor=0.25, random_state=42) inner_circle = X2[y2 == 1] inner_labels = np.full(len(inner_circle), 2) # 给内圈设置新标签2 # 合并三组数据 X_3 = np.vstack([X1, inner_circle]) Y_3 = np.hstack([y1, inner_labels]) # 绘制散点图,用不同颜色区分三个圆 plt.scatter(X_3[:, 0], X_3[:, 1], c=Y_3, cmap='viridis') plt.show()
方法二:手动生成第三组圆数据
如果需要更灵活控制每个圆的半径、噪声和样本量,可以直接用numpy生成极坐标转换后的点,再添加噪声。
示例代码:
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_circles # 先生成前两个圆 X1, y1 = make_circles(n_samples=4000, noise=0.1, factor=0.5, random_state=42) # 手动生成第三个内圈 n_inner = 1609 theta = np.random.uniform(0, 2*np.pi, n_inner) radius = 0.25 # 内圈半径,比make_circles的factor对应半径小 x = radius * np.cos(theta) + np.random.normal(0, 0.1, n_inner) # 添加噪声 y = radius * np.sin(theta) + np.random.normal(0, 0.1, n_inner) inner_circle = np.column_stack([x, y]) inner_labels = np.full(n_inner, 2) # 合并数据 X_3 = np.vstack([X1, inner_circle]) Y_3 = np.hstack([y1, inner_labels]) # 绘图 plt.scatter(X_3[:, 0], X_3[:, 1], c=Y_3, cmap='viridis') plt.show()
关键说明
factor参数:make_circles的factor是内圈半径/外圈半径,比如factor=0.5时内圈半径是外圈的一半,调整这个值可以控制圆之间的间距。- 噪声控制:
noise参数控制点的离散程度,保持一致能让三个圆的视觉效果统一。 - 样本量:根据需求分配每个圆的样本数,总和等于你需要的5609即可。
内容的提问来源于stack exchange,提问作者Trying_To_be_a_coder
相关产品推荐
相关产品推荐

