Я хочу выполнить кластеризацию с использованием алгоритма DBSCAN с набором данных, который содержит 3 балла. Это набор данных:ValueError: значение истинности массива с несколькими элементами неоднозначно. Используйте a.any() или a.all() python dbscan 3 измерения point
1 5 7
12 8 9
2 4 10
6 3 21
11 13 0
6 3 21
11 13 0
3 7 1
1 9 2
1 5 7
я кластеризацию с этим кодом:
from math import sqrt, pow
def __init__(eps=0.1, min_points=2):
eps = 10
min_points = 2
visited = []
noise = []
clusters = []
dp = []
def cluster(data_points):
visited = []
dp = data_points
c = 0
for point in data_points:
if point not in visited:
visited.append(point)
print point
neighbours = region_query(point)
#print neighbours
if len(neighbours) < min_points:
noise.append(point)
else:
c += 1
expand_cluster(c, neighbours)
#cluster(data_points)
def expand_cluster(cluster_number, p_neighbours):
cluster = ("Cluster: %d" % cluster_number, [])
clusters.append(cluster)
new_points = p_neighbours
while new_points:
new_points = pool(cluster, new_points)
def region_query(p):
result = []
for d in dp:
distance = (((d[0] - p[0])**2 + (d[1] - p[1])**2 + (d[2] - p[2])**2)**0.5)
print distance
if distance <= eps:
result.append(d)
return result
#p_neighbours = region_query(p=pcsv)
def pool(cluster, p_neighbours):
new_neighbours = []
for n in p_neighbours:
if n not in visited:
visited.append(n)
n_neighbours = region_query(n)
if len(n_neighbours) >= min_points:
new_neighbours = unexplored(p_neighbours, n_neighbours)
for c in clusters:
if n not in c[1] and n not in cluster[1]:
cluster[1].append(n)
return new_neighbours
@staticmethod
def unexplored(x, y):
z = []
for p in y:
if p not in x:
z.append(p)
return z
в этом коде есть point
и n
переменные, то же самое с data_points
, который содержит набор данных. Если я прочитаю руководство, я думаю, что этот код может работать на самом деле, но когда я запускаю функцию cluster()
, появляется ошибка.
Traceback (most recent call last):
File "<ipython-input-39-77eb6be20d82>", line 2, in <module>
if n not in visited:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Я не знаю, почему этот код все еще получает эту ошибку, в то время как я могу изменить n
или point
переменных с данными индекса. Вы знаете, что не так с этим кодом? как я могу заставить его работать?
спасибо за вашу помощь ..
У вас есть серьезные проблемы с локальными и глобальными переменными в вашем коде. – Daniel