生成K-means聚类的随机(x,y)点

3
我正试图在Python中随机生成一堆点,用于测试K-means聚类算法。以下是我的代码:
N = 100
random_x0 = np.random.randn(N) + (np.random.randint(0,100) * np.random.randint(1,4))
random_x1 = np.random.randn(N) + (np.random.randint(0,100) * np.random.randint(1,4))
random_x2 = np.random.randn(N) + (np.random.randint(0,100) * np.random.randint(1,4))
random_y0 = np.random.randn(N) + (np.random.randint(0,100) * np.random.randint(1,4))
random_y1 = np.random.randn(N) + (np.random.randint(0,100) * np.random.randint(1,4))
random_y2 = np.random.randn(N) + (np.random.randint(0,100) * np.random.randint(1,4))

可以想象,每组random_x[index]坐标都与其y对应项匹配。

(random_x0, random_y0), (random_x1, random_y1), (random_x2, random_y2)

期望结果分布的图片

由于我正在测试聚类算法,我希望我的数据点有一定程度的聚集...但这似乎太多了。我尝试添加一个1-100之间的随机数,然后将其乘以一个1-4之间的随机数....我做错了什么,才会得到如此一致的随机结果?


3
这两个末尾项(即 randint 调用)仅用于移动聚类,而不是使它们扩散。如果要使它们扩散,请将您的随机向量(来自 randn)乘以一些静态缩放因子--可能类似于:random_x0 = scale * np.random.randn(N)。 离原点最远的点将会离原点scale的距离。这里的注释可能有所帮助 - jedwards
2
@jedwards 高斯分布的标准差(在这种情况下为“scale”)与点距其均值的最大距离不同。 - dorverbin
2
@dorverbin我已经链接了文档,但是没有阅读它,假设它像rand一样工作,但是跨越更广的区间。发现得好。 (为了明确:我的第一个评论的最后一句话不是真的,其余仍然成立) - jedwards
你可能想要查看 https://stackoverflow.com/questions/47265844/adding-random-weighted-point/47266653#47266653 - Severin Pappadeux
2个回答

1

randn是一个均值为零,方差为一的高斯随机变量。为了生成一个均值为m,标准差为s的高斯变量,可以使用公式m + s*randn()。当你执行randn(N) + constant时,实际上创建的是均值等于constant,标准差为一的高斯变量。现在,constant由一个随机变量给出,可以从0到297变化,即质心的分布范围比方差大得多。您可能希望质心(即平均值)的分布是几个标准差。您还可以向random.normal传递多个均值和标准差值,例如:

np.random.normal(loc=[0, 1, 2], scale=[0.5, 0.75, 1.0], size=(N, 3))

1
首先,您需要决定所需的分布类型。假设是高斯分布,因此我们可以使用 random.gauss
我将创建一个生成具有高斯分布的二维点的函数:
def generate_point(mean_x, mean_y, deviation_x, deviation_y):
    return random.gauss(mean_x, deviation_x), random.gauss(mean_y, deviation_y)

然后,确定要使用多少个簇,每个簇中有多少个点以及在簇和点内部使用哪些偏差。例如:

cluster_mean_x = 100
cluster_mean_y = 100
cluster_deviation_x = 50
cluster_deviation_y = 50
point_deviation_x = 5
point_deviation_y = 5

number_of_clusters = 5
points_per_cluster = 50

然后生成聚类中心:
cluster_centers = [generate_point(cluster_mean_x,
                                  cluster_mean_y,
                                  cluster_deviation_x,
                                  cluster_deviation_y)
                   for i in range(number_of_clusters)]

然后为每个簇生成实际点数:
points = [generate_point(center_x,
                         center_y,
                         point_deviation_x,
                         point_deviation_y)
          for center_x, center_y in cluster_centers
          for i in range(points_per_cluster)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接