为K均值聚类生成随机(x,y)点

时间:2018-05-01 02:59:18

标签: python random coordinates cluster-analysis k-means

我试图在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]坐标都与它相对应。

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

image of expected resulting distribution

由于我正在测试一个聚类算法,我希望我的数据点是SOMEWHAT聚类...但这似乎太多了。我试图从1-100中添加一个随机数,然后用1-4中的随机数添加一个随机数....我做错了什么来得到如此一致的随机结果?

2 个答案:

答案 0 :(得分:0)

randn是一个随机的高斯变量,均值为零,方差等于1。为了生成均值m和标准偏差为s的高斯变量,可以使用m + s*randn()。由于您执行randn(N) + constant,因此基本上可以创建标准偏差为1且均值等于constant的高斯变量。现在constant由一个随机变量给出,该变量可以在0到297之间变化,即质心的扩展比方差大得多。您可能想要一个重心(即均值)扩展,这是一些标准偏差。您还可以传递多个均值和std.dev。值random.normal,例如:

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

答案 1 :(得分:0)

首先,您需要确定所需的分发方式。假设它的高斯,所以我们可以使用random.gauss

我没有创建一个生成具有高斯分布的2D点的函数:

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)]