При добавлении списка иногда выдается ошибка «IndexError: список индексов вне диапазона», и результаты не соответствуют ожидаемым - PullRequest
0 голосов
/ 28 августа 2018

Так что я все еще новичок в программировании и пытаюсь реализовать метод инициализации для проблемы кластеризации с использованием python-2.7.
Шаги:

  1. Выберите случайные данные из набора данных в качестве первого центроида
  2. Число данных в центроидах
  3. Рассчитать вероятность всех данных до ближайшего центроида по формуле

    P (x) = D (x) ** 2 / сумма (D (x) ** 2), в которой D (x) - евклидово расстояние от данных [x] до ближайшего центроида

  4. Выберите данные с наибольшим значением P (x), затем вернитесь к номеру 2.

Но когда я пытаюсь добавить данные, иногда я получаю эту ошибку «IndexError: список индексов вне диапазона», и иногда код работает, но дает только 2 разных центроида, а с 3 по n центроид дают те же значения, что и у 2 центроида.

Где я сделал не так?

(Изменить: я отредактировал шаги, чтобы сделать это, потому что я был не прав)

def pickcentroid(df):
    x = df.values.tolist()
    n_klas = 3
 #   random.seed(2)
    idx_pusat_pertama = random.randint(0, len(df))
    centroid = []
    centroid_idx = []
    centroid.append(x[idx_pusat_pertama])
    centroid_idx.append(idx_pusat_pertama)
    prob_data = []
    while len(centroid) < n_klas:
        ac_mindist = 0
        for i in x:
            dist_ke_c = []
            for c in centroid:
                dist_ke_c.append(dist(i,c))
            ac_mindist += min(dist_ke_c)**2
        for idx in range(len(df)) : 
            if idx not in centroid_idx:
                dist_ke_c2 = []
                mindist_per_data = 0
                for c in centroid:
                    dist_ke_c2.append(dist(x[idx],c))
                mindist_per_data = min(dist_ke_c2)**2
                prob_data.append(mindist_per_data/ac_mindist)
            else:
                prob_data.append(0)
        new_cen_idx = prob_data.index(max(prob_data))
        centroid_idx.append(new_cen_idx)
        centroid.append(x[new_cen_idx])

    print(centroid)
    return centroid

def dist(x,y):
    r = np.array(x) - np.array(y)
    distance = np.linalg.norm(r)
#    print(distance)
    return distance


c = pickcentroid(df)

А данные выглядят так:

-0.19864726098025476,-0.2174575876560727
-0.19427576174137176,-0.2658220115362011
0.24385376109048476,0.1555938625346895
-0.23636704446757748,0.14005058641250595
0.37563103051045826,0.33204816285389527
-0.13210748354848134,-0.0019122205360639893
-0.17120654390561796,0.04231258139538708
0.2865229979171536,0.34175192153482764
-0.328896319205639,-0.22737124434792602
0.03115098005450885,0.17089336362457433

Большое спасибо за вашу помощь

1 Ответ

0 голосов
/ 28 августа 2018

randint(a, b) возвращает случайные целые числа от a до b, , включая b. Таким образом, когда вы используете randint(0, len(x)), вы можете получить значение len(x) в качестве вывода, которое выходит за пределы диапазона при использовании в качестве индекса.

В вашем случае вы могли бы вместо этого использовать random_value = random.choice(x).

...