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