在python中生成具有三个类的3个圆形数据集

Posted

技术标签:

【中文标题】在python中生成具有三个类的3个圆形数据集【英文标题】:Generate 3 circles dataset with three classes in python 【发布时间】:2021-11-09 14:24:12 【问题描述】:

我实际上想在 python 中生成 3 个圆圈,一个在另一个圆圈中,其中一个具有三个不同的类(class0、class1、class2)(首先是更大的圆圈,然后是第二大圆圈,然后是第三个圆圈)。我只能从下面的代码中生成 2 个具有两个类的圆圈。谁能帮我解决这个问题?

import numpy as np
import pylab as pl
import sklearn.metrics as sm
from sklearn.datasets import make_circles
X, y = make_circles(n_samples=200)
print(X)
print(y)
plt.scatter(X[:,0],X[:,1], marker='o', facecolors='none', edgecolor='r')

【问题讨论】:

【参考方案1】:

可能有一种更礼貌的方法,但我在这里展示了一种实用的方法。

基本上,您可以使用 make_circles 函数生成另外两个圆圈,但使用另一个超参数 factor

我所做的是生成相同的主圆,然后生成一个乘以因子值(在我的情况下为 0.6)的新圆。

代码如下:

X, y = make_circles(n_samples=200)
z, w = make_circles(n_samples=200, factor=0.6)

plt.scatter(X[:,0],X[:,1],  facecolors='none', edgecolor='r')
plt.scatter(z[:,0],z[:,1],  facecolors='none', edgecolor='r')

如果要更改新圆的半径,请使用factor

这段代码唯一的问题是大圆圈被重复了(绘制了两次),但是,由于它们是重叠的,所以没有视觉问题。

【讨论】:

圆圈的形状很棒,但只有 2 个类,所以可能无法解决我的问题。我需要用 3 个类创建 3 个圆圈。【参考方案2】:

根据make_circles和make_blobs的文档:

ma​​ke_circles

sklearn.datasets.make_circles(n_samples=100, *, shuffle=True, noise=None, random_state=None, factor=0.8) 在 2d 中制作一个包含较小圆圈的大圆圈。一个简单的玩具数据集,用于可视化聚类和分类算法。

ma​​ke_blob sklearn.datasets.make_blobs(n_samples=100, n_features=2, *, center=None, cluster_std=1.0, center_box=- 10.0, 10.0, shuffle=True, random_state=None, return_centers=False) 生成用于聚类的各向同性高斯斑点。

你不能用ma​​ke_circles做3个圆,但是要生成3个类,你可以用ma​​ke_blobs

对于有3个类的圆形数据,可以结合使用这两个函数,如下例:

import sklearn.datasets as ds
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

data, labels = ds.make_circles(n_samples=100, 
                               shuffle=True, 
                               noise=0.0, 
                               random_state=42)

center = [[3, 4]]
data2, labels2 = make_blobs(n_samples=100, 
                            cluster_std = 0.2,
                            centers=center,
                            random_state=1)


for i in range(len(center)-1, -1, -1):
    labels2[labels2==0+i] = i+2

print(labels2)
labels = np.concatenate([labels, labels2])
data = data * [1.2, 1.8] + [3, 4]

data = np.concatenate([data, data2], axis=0)

然后下面的代码查看结果:

fig, ax = plt.subplots()

colours = ["orange", "blue", "magenta"]
label_name = ["Class1", "Class2", "Class3"]
for label in range(0, len(center)+2):
    ax.scatter(data[labels==label, 0], data[labels==label, 1], 
               c=colours[label], s=40, label=label_name[label])


ax.set(xlabel='X',
       ylabel='Y',
       title='dataset')


ax.legend(loc='upper right')

结果如下:

另一种方法是使用两个 make_circle 函数生成 4 个圆,但使用其中的 3 个。

import sklearn.datasets as ds
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

data, labels = ds.make_circles(n_samples=100, 
                               shuffle=True, 
                               noise=0.01, 
                               random_state=42)


data2, labels2 = ds.make_circles(n_samples=100, 
                               shuffle=True, 
                               noise=0.0, 
                               random_state=42)

data2 = data2 * [1.2, 1.8] 

然后使用以下方法绘制结果:

fig, ax = plt.subplots()
colours = ["orange", "blue"]
label_name = ["Class1", "Class2"]
ax.scatter(data[labels==0, 0], data[labels==0, 1], color='red'
               ,s=40)
ax.scatter(data[labels==1, 0], data[labels==1, 1], color='green'
               ,s=40)
ax.scatter(data2[labels2==0, 0], data2[labels2==0, 1], color='blue',
               s=40)

ax.set(xlabel='X',
       ylabel='Y',
       title='dataset')


ax.legend(loc='upper right')

那么结果表示如下:

如果你想改变圆的大小(第三个圆,这里是外面的那个),你可以乘以不同的系数。

data2 = data2 * [a1, a2] 

其中 a1 和 a2 可以是任何值,但完全介于 0 和 2 之间。如果值低于 1,则圆圈将放在其他圆圈内,反之亦然。

【讨论】:

形状不是完美的圆形。有什么办法可以得到完美的圆圈。 您可以在 make circle 中更改噪声值,例如噪声 =0.01。还要更改 make_blobs 中的 cluster_std(例如,cluster_std = 0.3)以生成更平滑的结果。 我已经为圈子做过,但我无法为制作 blob 做。 为什么你做不到?我试过了,效果很好。 你能告诉我你在 make_blobs 中使用的超参数的值吗?

以上是关于在python中生成具有三个类的3个圆形数据集的主要内容,如果未能解决你的问题,请参考以下文章

在python中生成组合

如何在 Python 中生成具有指定均值、方差、偏度、峰度的数据?

在R中生成大量组合[关闭]

从真实数据中生成合成数据(用于回归问题)

圆形图和圆形统计

在 Python (3.3) 中生成相关数据