我的代码抛出'Y [i]不在列表中'ValueError,即使此列表由Y中的唯一值组成。我打印了列表,列表类型和Y [i]的类型但没有找到解决方案。此外,错误也不规律地发生。
提供一些上下文:我正在尝试编写一段简单的代码来检查我的K-Means分类器是否正确分类。因为聚类装置是未标记的整数,我希望我的输出是整数矩阵,使得C [h] [y]表示我的模型将X [i]分类为h,而实际标签为y的次数。因为给定的标签不一定是整数,所以我尝试通过创建可能的标签列表(V)来为它们分配整数,并使用该列表的索引而不是标签本身。
代码(包括调试打印):
def classify(func, D):
X = D[0]
Y = D[1]
V = list(np.unique(Y)) # <- V contains all values of Y
print(V)
print(type(V[0]),type(V[1]),type(V[2]))
C = [V]
for i in range(len(Y)):
h = func(X[i])
while len(C) < h+1:
C.append(np.zeros(len(V)))
if not Y[i] in V:
print(type(Y[i]))
y = V.index(Y[i]) # <- V does not contain Y[i]?
C[h][y] += 1
return np.array(C)
输出:
[1.0, 2.0, 3.0]
<class 'numpy.float64'> <class 'numpy.float64'> <class 'numpy.float64'>
<class 'numpy.float64'>
Traceback (most recent call last):
File "leren6.py", line 38, in <module>
main()
File "leren6.py", line 18, in main
C = classify(model, Data)
File "leren6.py", line 33, in classify
y = V.index(Y[i])
ValueError: 3.0 is not in list
如果你能解决这个问题,你就会非常棒。
答案 0 :(得分:1)
没有给出太多信息(下一次重现该bug的示例函数参数会有所帮助),但我怀疑这一行是负责的:
C = [V]
问题是C [0]成为V的另一个名称。因此,只要在h = 0时执行行C[h][y] += 1
,V中的一个项目就会被破坏。因此,虽然V可能已经开始为[np.float64(1.0), np.float64(2.0), np.float64(3.0)]
,但它可能不会保持这种状态,因为它会在循环中被侵蚀。
答案 1 :(得分:0)
可能是舍入问题,您正在处理非整数值。尝试替换1.0,2.0 ......连接1,2 ......并看看会发生什么