【发布时间】:2019-02-02 21:35:47
【问题描述】:
所以我仍然是编程新手,并尝试使用 python-2.7 实现集群问题的初始化方法。
步骤是:
- 从数据集中选择一个随机数据作为第一个质心
- 同时质心中的数据个数
使用公式计算所有数据到其最近质心的概率
P(x) = D(x)**2 / sum(D(x)**2),其中 D(x) 是 data[x] 到最近质心的欧式距离
选择 P(x) 最高的数据,然后循环回到第二个。
但是当我尝试附加数据时,有时会收到此错误“IndexError: list index out of range”,有时代码有效,但只给出 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
非常感谢您的热心帮助
【问题讨论】:
标签: python python-2.7 pandas cluster-analysis