[英]'int' object has no attribute 'flatten'
I am working on a code this gives me a error saying 'int' object has no attribute 'flatten'
. 我正在编写代码,这给我一个错误,说
'int' object has no attribute 'flatten'
。 I am using kmean algorithm for k=2 to cluster my data (passed as a list of data points). 我正在使用kmean算法(k = 2)对我的数据进行聚类(作为数据点列表传递)。
import csv
import numpy as np
k=2
data=[23,43,67,89,1,10,101,243,34]
clusters = [[] for i in range(k)]
def kmeans(data, k):
centroids = []
centroids = randomize_centroids(data, centroids, k)
old_centroids = [[] for i in range(k)]
iterations = 0
while not (has_converged(centroids, old_centroids, iterations)):
iterations += 1
clusters = euclidean_dist(data, centroids, clusters) # assign data points to clusters
index =0 # recalculate centroids
for cluster in clusters:
old_centroids[index] = centroids[index]
centroids[index] = np.mean(cluster, axis=0).tolist()
index += 1
print("The total number of data instances is: " + str(len(data)))
print("The total number of iterations necessary is: " + str(iterations))
print("The means of each cluster are: " + str(centroids))
print("The clusters are as follows:")
for cluster in clusters:
print("Cluster with a size of " + str(len(cluster)) + " starts here:")
print(np.array(cluster).tolist())
print("Cluster ends here.")
# Calculates euclidean distance between
# a data point and all the available cluster
# centroids.
def euclidean_dist(data, centroids, clusters):
for instance in data: # Find which centroid is the closestto the given data point.
print("hello")
mu_index = min([(i[0], np.linalg.norm(instance-centroids[i[0]])) \
for i in enumerate(centroids)], key=lambda t:t[1])[0]
try:
clusters[mu_index].append(instance)
except KeyError:
clusters[mu_index] = [instance]
# If any cluster is empty then assign one point
# from data set randomly so as to not have empty
# clusters and 0 means.
for cluster in clusters:
if not cluster:
cluster.append(data[np.random.randint(0, len(data), size=1)].flatten().tolist())
return clusters
# randomize initial centroids
def randomize_centroids(data, centroids, k):
for cluster in range(0, k):
print("hello")
centroids.append(data[np.random.randint(0, len(data), size=1)].flatten().tolist())
return centroids
# check if clusters have converged
def has_converged(centroids, old_centroids, iterations):
MAX_ITERATIONS = 1000
if iterations > MAX_ITERATIONS:
return True
return old_centroids == centroids
if __name__=='__main__' :
kmeans([23,43,67,89,1,10,101,243,34],2)
print("hello")
Traceback (most recent call last):
追溯(最近一次通话):
File "C:\\Users\\shri ram\\Desktop\\summer_code_files\\ddpcr_analysis.py", line 66, in kmeans([23,43,7,89,1,10,101,243,34,2],2) File "C:\\Users\\shri ram\\Desktop\\summer_code_files\\ddpcr_analysis.py", line 13, in kmeans
文件“ C:\\ Users \\ shri ram \\ Desktop \\ summer_code_files \\ ddpcr_analysis.py”,行66,以kmeans([23,43,7,89,1,10,101,243,34,2],2)文件“ C:\\ Users \\ shri ram \\ Desktop \\ summer_code_files \\ ddpcr_analysis.py“,第13行,在kmeans中
clusters = euclidean_dist(data, centroids, clusters) # assign data points to clusters
clusters = euclidean_dist(data,centroids,clusters)#将数据点分配给集群
UnboundLocalError: local variable 'clusters' referenced before assignment
UnboundLocalError:分配前已引用局部变量“集群”
As mentioned in comments, you tried apply flatten
to one int
element (not to numpy array). 如评论中所述,您尝试将
flatten
应用于一个int
元素(而不是numpy数组)。 Try 尝试
centroids.append([data[np.random.randint(0, len(data), size=1)]])
instead of 代替
centroids.append(data[np.random.randint(0, len(data), size=1)].flatten().tolist())
Also, you should move clusters
initialization to kmeans
function 另外,您应该将
clusters
初始化移至kmeans
函数
...
def kmeans(data, k):
clusters = [[] for i in range(k)]
centroids = []
centroids = randomize_centroids(data, centroids, k)
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.