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

如何使用scikit-learn生成3个分属不同类别的同心圆数据集

结论

Scikit-learn内置的make_circles接口仅支持生成2类同心圆,没有直接生成3类的官方实现,你可以通过手动生成极坐标点的方式快速实现需求,调整成本很低。

实现逻辑

  • 每个同心圆对应一个固定半径,在极坐标系下生成均匀分布的角度值,计算对应的(x,y)坐标
  • 给每个类别的坐标点添加高斯噪声模拟真实数据分布
  • 给不同半径的圆分配不同的类别标签,最后合并所有样本即可

完整实现代码

from matplotlib import pyplot as plt
from pandas import DataFrame
import numpy as np

def make_concentric_circles(n_samples_per_class=1000, n_classes=3, noise=0.04, radii=None):
    # 若未指定半径,默认按1、2、3...等差设置
    if radii is None:
        radii = [i+1 for i in range(n_classes)]
    X = []
    y = []
    for class_idx, radius in enumerate(radii):
        # 生成极坐标角度,均匀分布在0~2π
        theta = np.linspace(0, 2*np.pi, n_samples_per_class)
        # 计算坐标
        x = radius * np.cos(theta)
        y_point = radius * np.sin(theta)
        # 添加噪声
        x += np.random.normal(0, noise, n_samples_per_class)
        y_point += np.random.normal(0, noise, n_samples_per_class)
        # 加入总样本
        X.extend(np.column_stack((x, y_point)))
        y.extend([class_idx]*n_samples_per_class)
    return np.array(X), np.array(y)

# 生成3类同心圆,每个类别1000个样本
X, y = make_concentric_circles(n_samples_per_class=1000, n_classes=3, noise=0.04)

# 后续处理和你原有逻辑一致
df = DataFrame(dict(x1=X[:,0], x2=X[:,1], label=y))
colors = {0:'red', 1:'blue', 2:'green'}
fig, ax = plt.subplots()
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x1', y='x2', label=key, color=colors[key])

# 导出csv和绘图
export_csv = df.to_csv(r'blobs.csv', index = None, header=True)
plt.savefig("blobs.png")
plt.show()

如果需要调整同心圆的间距,直接修改radii参数传入自定义的半径列表即可,比如radii=[0.5, 1.2, 2]可以自定义不同圈层的距离。

内容的提问来源于stack exchange,提问作者Ytt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:06:03