Так что я все еще новичок в программировании и пытаюсь реализовать метод инициализации для проблемы кластеризации с использованием python-2.7.
Шаги:
- Выберите случайные данные из набора данных в качестве первого центроида
- Число данных в центроидах
Рассчитать вероятность всех данных до ближайшего центроида по формуле
P (x) = D (x) ** 2 / сумма (D (x) ** 2), в которой D (x) - евклидово расстояние от данных [x] до ближайшего центроида
Выберите данные с наибольшим значением 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
Большое спасибо за вашу помощь