Я реализую свой собственный алгоритм kmeans для набора данных.Когда я выбираю любые случайные точки в наборе данных как центроиды, я получаю очень низкую точность.Но когда я выбираю один центроид случайным образом из каждого класса данных, я получаю хорошую точность.Пожалуйста, помогите мне, где я иду не так.Ниже моя реализация:
Сначала я генерирую случайные центроиды и передаю их функции, чтобы назначить каждую точку кластеру, основываясь на том, какой центроид она ближе к
def assignClustersKNN(features,centroids,labels):
assignments = defaultdict(list)
distances = [[0 for x in range(len(centroids))] for y in range(len(features))]
#Iterating over all data points
for i in range(len(features)):
#Iterating over all centroids
for j in range(0,len(centroids)):
distances[i][j] = euclidean(features[i],centroids[j])
#Getting the index of the centroid which is the closest
clusterAssigned = distances[i].index(min(distances[i]))
#adding the point to the closest cluster
assignments[clusterAssigned].append(features[i])
return assignments
Затем,Я обновляю центроид каждого кластера, вычисляя среднее значение точек в кластере, который является центроидом этого кластера
def updateCentroids(assignments):
newCentroids = np.zeros(shape=(len(assignments.keys()),3))
for i in assignments.keys():
#getting the datapoints of each cluster
clusterMembers = assignments[i]
#computing the mean of the datapoints of the cluster
newCentroids[i] = np.mean(clusterMembers,axis=0)
return newCentroids
Я выбрал условие остановки как, когда центроиды кластера витерация не отличается от центроидов от предыдущей итерации, это означает, что кластеры не изменились, и я остановил процесс