在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的文档:
make_circles
sklearn.datasets.make_circles(n_samples=100, *, shuffle=True, noise=None, random_state=None, factor=0.8) 在 2d 中制作一个包含较小圆圈的大圆圈。一个简单的玩具数据集,用于可视化聚类和分类算法。
make_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) 生成用于聚类的各向同性高斯斑点。
你不能用make_circles做3个圆,但是要生成3个类,你可以用make_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个圆形数据集的主要内容,如果未能解决你的问题,请参考以下文章