You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:02:26