Skip to main content
 首页 » 编程设计

python之"ValueError: The truth value of an array with more than one element is ambiguous"

2025年05月04日15TianFang

我正在尝试执行以下代码 :( 这是用 Python 编写的 Kmeans 算法的简单代码。两步过程继续进行,直到簇和质心的分配不再改变。收敛是有保证的,但是解决方案可能是局部最小值。在实践中,该算法会运行多次并取平均值。

import numpy as np 
import random 
from numpy import * 
 
points = [[1,1],[1.5,2],[3,4],[5,7],[3.5,5],[4.5,5], [3.5,4]] 
 
 
def cluster(points,center): 
  clusters = {} 
 
  for x in points: 
 
    z= min([(i[0], np.linalg.norm(x-center[i[0]]))  for i in enumerate(center)], key=lambda t:t[1]) 
 
    try: 
      clusters[z].append(x) 
    except KeyError: 
      clusters[z]=[x] 
 
  return clusters 
 
def update(oldcenter,clusters): 
 
 d=[] 
 r=[] 
 newcenter=[] 
 
 for k in clusters: 
  if k[0]==0:  
   d.append(clusters[(k[0],k[1])]) 
 
  else: 
   r.append(clusters[(k[0],k[1])]) 
 
 c=np.mean(d, axis=0) 
 u=np.mean(r,axis=0) 
 newcenter.append(c) 
 newcenter.append(u) 
 
 return newcenter 
 
def shouldStop(oldcenter,center, iterations): 
    MAX_ITERATIONS=4 
    if iterations > MAX_ITERATIONS: return True 
    return (oldcenter == center) 
 
def kmeans():    
  points = np.array([[1,1],[1.5,2],[3,4],[5,7],[3.5,5],[4.5,5], [3.5,4]]) 
  clusters={} 
  iterations = 0 
  oldcenter=([[],[]])    
  center= ([[1,1],[5,7]])                         
 
  while not shouldStop(oldcenter, center, iterations): 
        # Save old centroids for convergence test. Book keeping. 
        oldcenter=center 
        iterations += 1 
        clusters=cluster(points,center)   
        center=update(oldcenter,clusters) 
 
  return (center,clusters) 
 
kmeans() 

但现在我卡住了。有人可以帮我解决这个问题吗?

Traceback (most recent call last): 
  File "has_converged.py", line 64, in <module> 
    (center,clusters)=kmeans() 
  File "has_converged.py", line 55, in kmeans 
    while not shouldStop(oldcenter, center, iterations): 
  File "has_converged.py", line 46, in shouldStop 
    return (oldcenter == center) 
ValueError: The truth value of an array with more than one element is ambiguous. 
 Use a.any() or a.all() 

请您参考如下方法:

如错误所示,您不能在 NumPy 中使用 == 比较两个数组:

>>> a = np.random.randn(5) 
>>> b = np.random.randn(5) 
>>> a 
array([-0.28636246,  0.75874234,  1.29656196,  1.19471939,  1.25924266]) 
>>> b 
array([-0.13541816,  1.31538069,  1.29514837, -1.2661043 ,  0.07174764]) 
>>> a == b 
array([False, False, False, False, False], dtype=bool) 

== 的结果是一个按元素排列的 bool 数组。您可以使用 all 方法判断此数组是否全部为真:

>>> (a == b).all() 
False 

也就是说,检查质心是否以这种方式改变是 unreliable because of rounding .您可能想使用 np.allclose相反。