web-dev-qa-db-fra.com

L'objet 'NoneType' n'est pas itérable lors du renvoi des valeurs

Je dois vérifier si une grappe n'a qu'un seul point associé si besoin de calculer la distance euclidienne avec tous les autres points de la grappe et le point de distance minimale sera ajouté à la grappe de longueur un (à laquelle un point est associé). Après que l'ajout d'un point aux valeurs de cluster de label et centre doit être mis à jour, j'ai tout fait, mais parfois, lorsque le code est exécuté, l'erreur "L'objet 'NoneType' n'est pas itérable" est renvoyée lorsque les valeurs . Je suis coincé avec cette partie s'il vous plaît aider, merci d'avance.Voici mon code 

import numpy as np
import matplotlib.pyplot as mlt
import pandas as pd
from clustering import Kmeans_clu
import random
from collections import Counter, defaultdict
from math import sqrt
import matplotlib.pyplot as plt
import random



def ClusterIndicesComp(clustNum, labels_array):  # For extracting  points from the label
    return np.array([i for i, x in enumerate(labels_array) if x == clustNum])


def index(lst, obj, n):   # To find the index of of Lable which needs to be change
    count = 0
    for index, item in enumerate(lst):
        if item == obj:
            count += 1
        if count == n:
            return index
    raise ValueError('{} is not in list at least {} times'.format(obj, n))





def UpdateCentetr_Label(Index,lablelPlot1, plot2, lablePlot2, pop, plab, plot1, pcenter,cluster1,max_gen):

    s = list(plab) #Storing Value of Label in list
    print("Value of  in Label before\n", s)  # Before Updating the value of label
    s1 = Counter(s)
    print("Value of counter in before is \n", s1)
    Index=Index+1
    q = index(s, lablePlot2, Index)  #Storing the index of label which need to be changed
    s[q] = lablelPlot1          #Changing the label by labelPlot1
    ulabel = np.array(s)
    print("Value of an updated label is \n", ulabel)
    print("------------------------------------------")
    # print("Value of Pcenter in Updatedlabel\n",pcenter)
    ncenter = plot2 + plot1 / 2  #Calculating the center of label which have one point associated
    print("Value of new center to be updated\n", ncenter)
    ucenter = np.array(pcenter)
    #print("Value of ucenter is\n",ucenter)
    ucenter[lablelPlot1] = ncenter   #Changing the value of label with new center
    print("Value of updated center is\n", ucenter)
    ko = Counter(ulabel)
    print("Value of counter after updated label is\n", ko)
    LC1 = [t for (t, v) in ko.items() if v == 1]  # Again checking if there is label which have point associated
    t1 = np.array(LC1)
    if (t1.size):
        One_LengthCluster(cluster1, ulabel, ucenter, pop,max_gen) #To update the it again
    else:

        return ulabel,ucenter,cluster1






def ClusterPopulation(max_gen, population): # to cluster the population 


    pop = population
    plab1 = []
    pcenter = []
    u=[]
    cluster1 = int(input("Enter the cluster for new population\n"))
    plab=[]


    for i in range(0,max_gen):
        if (i % cluster1 == 1):      # Checking the condition of Kmeans Clustering
            u, label, t, l = Kmeans_clu(cluster1, population)   # Storing the values Center(u) anb label(u)
            plab1.insert(i, label)
            print("Plab is",plab)
            pcenter.insert(i, u)
            plab = np.array(plab1)
            plab=plab[0]
            #pcenter=np.array(pcenter)
            pcenter=pcenter[0]
            ulabel, ucenter, cluster1=One_LengthCluster(cluster1, plab, pcenter, pop,max_gen)   #To check if any label has one point associated
            return ulabel,ucenter,cluster1  #returning the value of ulabel, ucenter and cluster1
        else:
            print("Not need of clustering for this generation of\n", i)




def One_LengthCluster(cluster1, plab, pcenter, pop,max_gen):
    indexes = []
    Index=[]   #Store the index of Point which have minimum euclidean distance
    D=[] #Store the  minimum euclidean distance
    labelplot2=[] #Store the Label which have more than 2 points associated
    Point2=[]  #Store the Point which have minimum euclidean distance
    z=[]
    Smin=[]
    I=[]
    L=[]
    LC = Counter(plab)      #Counting number of points associated with label
    print("VAlue of LAbel and Number Cluster Associated with them\n", LC)
    LC1 = [t for (t, v) in LC.items() if v == 1]
    t1 = np.array(LC1)
    if (t1.size):# To check if any of the Label has one point associated if yes than calculate the distance with all the points 
        for b in range(len(t1)):
            plot1 = pop[ClusterIndicesComp(t1[b], plab)]  # Extracting the point in the label which have one point associated
            print("Point of label one Length PLOT1 is\n", np.array(plot1), t1[b])
            z1 = [t for (t, v) in LC.items() if v > 2]  # To check distance with label which more than 3 points associated
            z = np.array(z1)   #Storing the value in the array
            for d in range(len(z)):
                print("Value of Label which have more than two cluster is\n", z[d])
                plot2 = pop[ClusterIndicesComp(z[d], plab)] # Extracting the point in the label more than one point associated
                print("Value of plot2 in one length cluster is\n", plot2)
                for i in range(len(plot2)):
                    plotk = plot2[i]    # To get one point at a time from plot2
                    S = np.linalg.norm(np.array(plot1) - np.array(plotk))
                    print("Distance between {} and {} is {}\n".format(plot1,plotk,S))  # euclidian distance is calculated
                    if (i == 0):
                        Smin = S
                        Sminant = S
                        indexes.append(i)
                    else:
                        if (S < Sminant):
                            Smin = S
                            Sminant = Smin
                            indexes = []
                            indexes.append(i)
                        Elif (S == Sminant):
                            indexes = []
                            indexes.append(i)

                #print('indexes:')
                print("Index at which the minimum value is stored\n", indexes)  # To find the index of Label with which euclidian distance is minimum

                for i in range(len(indexes)):
                    Point2 = plot2[indexes[i]]
                    I = indexes[i]
                    L = z[d]
                    print("VAlues of Point{} which have min distance with plot1 is in Label {} and have Index {} and distance {}\n".format(Point2,L,I,Smin))

                if(len(z)==1):  #If Label which have more than 2 point associated is only one
                    D = Smin
                    Index = indexes[i]
                    labelplot2=z[d]
                    Point2=plot2[indexes[i]]
                    print("Here is the value\n", D, Index, labelplot2, Point2)
                    ulabel, ucenter, cluster1=UpdateCentetr_Label(Index,t1[b], Point2, z[d], pop, plab, plot1, pcenter,cluster1,max_gen)  #After Finding Point now update center and label
                    return ulabel,ucenter,cluster1


                Elif (len(z) > 1):  #If Label which have more than 2 point associated is more than one
                    D.append(Smin)
                    Index.append(I)
                    labelplot2.append(L)
                    #print("Value in list are------------\n", labelplot2)
                    print("Index value is\n",Index)
                    print("Label value is\n", labelplot2)

            z=min(D)    #Finding the minimum distance among all the labels
            k=D.index(z)  #Finding the index where minimum distance is stored in D
            Index=Index[k]
            labelplot2=labelplot2[k]
            Point2 = pop[ClusterIndicesComp(labelplot2, plab)]
            Point2=Point2[Index]
            print("Value of minimum distance is\n",z,Index,labelplot2,k,Point2)
            ulabel, ucenter, cluster1=UpdateCentetr_Label(Index,t1[b], Point2, labelplot2, pop, plab, plot1, pcenter,cluster1,max_gen)  #After Finding Point now update center and label
            return ulabel,ucenter,cluster1


        D=[]
        indexes=[]

    else:               #If no solution have one point associated in the label
        print("no lenght 1 cluster\n")
        return plab,pcenter,cluster1



population =np.random.Rand(10,4) #Generating the random population 
max_gen=10 #Giving value of max_gen 
ulabel, ucenter, cluster1=ClusterPopulation(max_gen, population) #Taking back the values of ucenter ,ulabel and cluster1
print("Value of ulabel is\n",ulabel)

Mon code K-means est ceci

from sklearn.cluster import KMeans
import numpy as np 

def Kmeans_clu(K, data):
    """
    :param K: Number of cluster
    :param data: 
    :return: 
    """
    kmeans = KMeans(n_clusters=K, init='random', max_iter=1, n_init=1).fit(data) ##Apply k-means clustering
    labels = kmeans.labels_
    clu_centres = kmeans.cluster_centers_
    z={i: np.where(kmeans.labels_ == i)[0] for i in range(kmeans.n_clusters)} #

    return clu_centres, labels ,z,kmeans

TraceBack est 

Traceback (most recent call last):
  File "C:/Users/hp/AppData/Local/Programs/Python/Python36/Population Clustering.py", line 184, in <module>
    ulabel, ucenter, cluster1=ClusterPopulation(max_gen, population) #Taking back the values of ucenter ,ulabel and cluster1
  File "C:/Users/hp/AppData/Local/Programs/Python/Python36/Population Clustering.py", line 85, in ClusterPopulation
    ulabel, ucenter, cluster1=One_LengthCluster(cluster1, plab, pcenter, pop,max_gen)   #To check if any label has one point associated
  File "C:/Users/hp/AppData/Local/Programs/Python/Python36/Population Clustering.py", line 169, in One_LengthCluster
    ulabel, ucenter, cluster1=UpdateCentetr_Label(Index,t1[b], Point2, labelplot2, pop, plab, plot1, pcenter,cluster1,max_gen)  #After Finding Point now update center and label
  File "C:/Users/hp/AppData/Local/Programs/Python/Python36/Population Clustering.py", line 54, in UpdateCentetr_Label
    One_LengthCluster(cluster1, ulabel, ucenter, pop,max_gen) #To update the it again
  File "C:/Users/hp/AppData/Local/Programs/Python/Python36/Population Clustering.py", line 169, in One_LengthCluster
    ulabel, ucenter, cluster1=UpdateCentetr_Label(Index,t1[b], Point2, labelplot2, pop, plab, plot1, pcenter,cluster1,max_gen)  #After Finding Point now update center and label
TypeError: 'NoneType' object is not iterable
3
Shivam Sharma

Je pense qu'il vous manque simplement une instruction return dans votre fonction UpdateCentetr_Label qui force la fonction à renvoyer None qui en fait n'est pas itérable

def UpdateCentetr_Label(Index,lablelPlot1, plot2, lablePlot2, pop, plab, plot1, pcenter,cluster1,max_gen):

     # other code here...

     if (t1.size):
         return One_LengthCluster(cluster1, ulabel, ucenter, pop,max_gen) #To update the it again
4
pansen

Vous avez manqué la déclaration simple return dans votre fonction 

def UpdateCentetr_Label(Index,lablelPlot1, plot2, lablePlot2, pop, plab, plot1, pcenter,cluster1,max_gen):

Vous devez juste ajouter return après avoir vérifié la taille de t1 dans le cluster One_length

if (t1.size):
         return One_LengthCluster(cluster1, ulabel, ucenter, pop,max_gen) #To update the it again
1
DunJen.coder