追加列表有时会出现“IndexError:list index out of range”错误,并导致不符合预期的结果

2024-10-03 06:24:33 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我还是一个新手,尝试使用python-2.7实现集群问题的初始化方法。
步骤如下:

  1. 从数据集中随机选取一个数据作为第一个质心
  2. While number of data in centroid<;n\u klas:计算到质心数据的数据距离
  3. 使用公式计算所有数据到其最近质心的概率

    p(x)=D(x)**2/和(D(x)**2),其中D(x)是从数据[x]到最近质心的欧氏距离

  4. 选取p(x)最高的数据,然后循环回到第2位。

但当我尝试附加数据时,有时会出现这样的错误“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

非常感谢你的帮助


Tags: 数据indffordatadistke质心
1条回答
网友
1楼 · 发布于 2024-10-03 06:24:33

randint(a, b)返回从ab的随机整数,包括b。因此,当使用randint(0, len(x))时,可能会将值len(x)作为输出,当用作索引时,该值超出范围。你知道吗

对于您的用例,您可以使用random_value = random.choice(x)。你知道吗

相关问题 更多 >