【问题标题】:Appending list sometimes give 'IndexError: list index out of range' error and results in not as expected附加列表有时会给出“IndexError:列表索引超出范围”错误并导致不符合预期
【发布时间】:2019-02-02 21:35:47
【问题描述】:

所以我仍然是编程新手,并尝试使用 python-2.7 实现集群问题的初始化方法。
步骤是:

  1. 从数据集中选择一个随机数据作为第一个质心
  2. 同时质心中的数据个数
  3. 使用公式计算所有数据到其最近质心的概率

    P(x) = D(x)**2 / sum(D(x)**2),其中 D(x) 是 data[x] 到最近质心的欧式距离

  4. 选择 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


    【解决方案1】:

    randint(a, b) 返回从ab 的随机整数,包括 b。因此,当您使用randint(0, len(x)) 时,您可能会得到值len(x) 作为输出,它在用作索引时超出范围。

    对于您的用例,您可以改用random_value = random.choice(x)

    【讨论】:

    • 所以我尝试将 b 的值更改为最后一个数据的索引,这样问题应该得到解决,但我仍然遇到同样的错误。它说与 centroid.append(x[new_cen_idx]) 有关
    • @Elenora: 你的列表可能是空的,所以 any 索引值会是错误的
    • 很抱歉,这很基本,但哪个列表可能是空的? '(x[new_cen_idx])'?但该列表不应该为空,因为它包含整个数据集,我只尝试将具有索引的数据值从“[new_cen_index]”附加到质心列表中。
    • @Elenora:x 列表。您的错误的唯一可能原因是idx_pusat_pertama 指的是x 没有的位置。当然,假设 x 是一个常规列表。
    • 是的,显然每当它返回错误时,“idx_pusat_pertama”总是返回相同的整数值,这确实超出了范围。在我的情况下,即使我的数据只有 20,它总是返回 35。如果我添加更多数据,它最终会得到相同的错误,但整数值不同。不过我还是不明白为什么会这样..
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2019-09-06
    • 2017-07-02
    • 2018-04-22
    • 2020-09-04
    相关资源
    最近更新 更多