2017-12-04 4 views
-1

これは私がコードを実行するとき、私は知らないpython3 TypeError: 'function' object is not iterableオブジェクト指向: 'NoneType'オブジェクトは反復可能ではありません。どうして?

ので、それは

w,c= PRank.Prank(c,w,X[i,:],Y[i]) 

はTypeError言う反復可能でない機能についての再発話題です。「NoneType」オブジェクトが反復可能ではありません。ここでのコードです。

import numpy as np 


class PRank: 



    def predict(X,w,c): 
    rank = min(np.where(np.dot(X,w)-c<0)[0]) 
    return(rank) 

    def Prank (c,w,x_t,y): 

    l_t=np.zeros(len(c)-1) 
    a_t=np.zeros(len(c)-1) 
    y_t =min(np.where((np.dot(w,x_t)-c) < 0)[0]) 

    if y_t != y: 
     for r in range(len(c)-1): 
      if (y <= r): 
        l_t[r] = -1 
      else: 
        l_t[r] = 1 
     for r in range(len(c)-1): 
      if (((np.dot(w,x_t)-c[r])*l_t[r]) <= 0): 
       a_t[r] = l_t[r] 
      else: 
       a_t[r] = 0 


      w = w + sum(a_t)*x_t 
      c_ = np.delete(c,len(c)-1) 
      c_ = c_ - a_t 
      c = np.append(c_,np.inf) 


     else: 
      w = w 
      c = c 

    def modelPRank(X,Y,maxrank=5,epsilon=0.02): 

     N=np.shape(X)[0] 
     feat=np.shape(X)[1] 
     c=np.sort(np.random.uniform(size=(maxrank+1,1)),axis=0) 
     c[0]=-np.inf 
     c[-1]=np.inf 
     w=np.zeros(feat) 
     ypred=np.zeros(N) 
     MSE=1 
     j=0 
     while MSE > epsilon: 
      for i in range(np.shape(X)[0]): 
        w,c= PRank.Prank(c,w,X[i,:],Y[i]) 
      for i in range(np.shape(X)[0]): 
       ypred[i]=min(np.where(np. dot(X[i,:],w)-c<0)[0]) 
      MSE=np.nanmean((ypred-Y)**2) 
      print(MSE) 
      j=j+1 
     return[MSE,w,ypred,c]  
X=np.random.uniform(1,5,(5000,2))  

Wini=[0.35,0.65] 
Y=np.round(np.dot(X,Wini)) 
PRank.modelPRank(X,Y) 

私がクラスを使用しない場合、コードはうまくいきます。なぜいたずらは反復可能ではないと私はそれを修正することができますと言う私は知らない。

+1

何かを返そうとしましたか? –

+0

お願いしますか? –

+0

エラーがどこで失敗したかを示す行は表示されませんか? – MCBama

答えて

2

次の2つの変数、wc.Prank(...)呼び出しの戻り値を解凍するためにはPythonを言っている:何でも右側に生成されることでなければならない、というPythonがやるためには

w,c= PRank.Prank(c,w,X[i,:],Y[i]) 

iterable(リストやタプルや文字列のような)であり、そのiterableからの各要素はあなたの2つの名前に値を割り当てるために使われます。

関数呼び出しは、反復可能ではないNoneを返します。 2つの異なる名前に別々の値を割り当てるために使用することはできません。

タプルに2つの値を返すように関数の最後にreturn文を追加します。

return w, c 

これは、クラスを使用してとは何の関係もありません。クラスを正しく使用していない場合など、インスタンスを作成していません。あなたがしたのは、関数をクラスオブジェクトに移動することだけでした。

+0

ありがとうございました..私はそれを見ませんでした...最後に、休んだ後に避けることができる愚かな質問。 –

関連する問題