Генерация случайных (x, y) точек для кластеризации K-средних - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь случайным образом сгенерировать набор точек для графа в python, чтобы проверить алгоритм кластеризации k-средних. Вот мой код.

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)

image of expected resulting distribution

Поскольку я тестирую алгоритм кластеризации, я хочу, чтобы мои точки данных были SOMEWHAT кластеризованными ... но это кажется слишком большим. Я пытался добавить случайное число от 1 до 100, а затем умножить его на случайное число от 1 до 4 ... что я делаю не так, чтобы получить такие последовательные случайные результаты?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Во-первых, вам нужно решить, какой тип дистрибутива нужен. Скажем, это гаусс, поэтому мы можем использовать 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)]
0 голосов
/ 31 января 2019

randn - случайная гауссовская переменная с нулевым средним и дисперсией, равной единице. Чтобы сгенерировать гауссову переменную со средним значением 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...