简体   繁体   English

'int'对象没有属性'flatten'

[英]'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM