Реализация алгоритма k-means. Ошибка TypeError: iter must be a iterable on line 50

287 просмотра
0
0 Комментариев

import math # подключение модуля math.
import turtle # подключение графического модуля turtle.
 
 
X=[(5.28,5.26),(6.09,5.83),(5.81,5.86),(6.14,5.80),(5.73,6.17),(5.53,5.50),(15.20,4.88),(13.70,6.55),(14.84,6.25),(13.85,6.18),(14.88,6.26),(13.70,6.15),(14.66,5.17),(-1.62,-0.32),(0.03,0.31),(0.18,-0.31),(-0.89,-0.60),(0.00,0.12),(-0.32,0.09),(-0.33,-0.37),(-0.45,0.63)]
 
def d(x1,x2,w1,w2):       #Евклидова мера расстояния
  return math.sqrt((x1-w1)**2+(x2-w2)**2)
 
w=[(5.28,5.26),(15.20,4.88),(-0.45,0.63)]
s=[(0.00,0.12),(6.14,5.80),(-1.62,-0.32)]
X1=[]
X2=[]
X3=[]
i=0
while w!=s:  #условие выполнения цикла ( пока старые и новые центры не будут совпадать )
  for k in X:
    if d(k[0],k[1],w[0][0],w[0][1])<d(k[0],k[1],w[1][0],w[1][1])and d(k[0],k[1],w[0][0],w[0][1])<d(k[0],k[1],w[2][0],w[2][1]):
      X1.append(k)
      for f in X1:
          turtle.penup()
          turtle.goto(f[0]*50,f[1]*50)
          turtle.pendown()
          turtle.dot(4,"black")
 
 
    elif d(k[0],k[1],w[1][0],w[1][1])<d(k[0],k[1],w[2][0],w[2][1]) and  d(k[0],k[1],w[1][0],w[1][1])<d(k[0],k[1],w[2][0],w[2][1]):
      X2.append(k)
      for p in X2:
          turtle.penup()
          turtle.goto(p[0]*50,p[1]*50)
          turtle.pendown()
          turtle.dot(4,"blue")
 
    elif d(k[0],k[1],w[2][0],w[2][1])<d(k[0],k[1],w[0][0],w[0][1]) and d(k[0],k[1],w[2][0],w[2][1])<d(k[0],k[1],w[1][0],w[1][1]):
      X3.append(k)
      for q in X3:
          turtle.penup()
          turtle.goto(q[0]*50,q[1]*50)
          turtle.pendown()
          turtle.dot(4,"orange")
 
 
    else:
      X1.append(k)
 
  s=w
  w=[] #очищаем список из центров кластеров
 
  w[0]=[((1/len(X1))*sum(X1[i][0]),(1/len(X1))*sum(X1[i][1]))]
 
  w.insert(0, w[0])
 
  w[1]=[(1/len(X2))*sum(X2[0]),(1/len(X2))*sum(X2[1])]
 
  w.insert(1,w[1])
 
  w[2]=[(1/len(X3))*sum(X3[0]),(1/len(X3))*sum(X3[1])]
 
  w.insert(2,w[2])
 
  X1=[]
  X2=[]  #очищаем списки в конце цикла программы
  X3=[]
  i+=1
 
 
turtle.mainloop()


Добавить комментарий

1 Ответы

Python Опубликовано 14.12.2018
0

Что означает — sum(X1[i][1])?

При попытке выполнить эту функцию интерпретатор находит, что i имеет какое-то конкретное значение (в вашем случае -0) подставляет его в функцию, получает sum(X1[0][1]). А при этом ожидается нечто итерируемое. О чем он вас и оповещает.

Поиск путей исправления ищете примерно в таком направлении :

sum([(X1[i][1]) for i in range(n)])

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up