如何使用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
相关产品推荐
相关产品推荐

