【问题标题】:Generate 3 circles dataset with three classes in python在python中生成具有三个类的3个圆形数据集
【发布时间】: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')

【问题讨论】:

    标签: python machine-learning scikit-learn data-science cluster-analysis


    【解决方案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_circlesmake_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 中使用的超参数的值吗?
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2018-01-08
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多