2013-09-30 63 views
1

現在我已經實現了python代碼。如何更改我的python代碼避免計算maxnumber索引

def logistic(z): 
    return 1.0/(1.0 + np.exp(-z)) 
def gradient_testing(X,Y,w): 
    K = len(w) 
    N = len(X) 
    s = np.zeros(K) 

    for i in range(N): 
     s += Y[i] * X[i] * logistic(-Y[i] * np.dot(X[i], w)) 

    s = -1 *s/N 
    return s 

X爲80×23矩陣,w爲1×23 martix,Y爲80 * 1 matrix.From我的代碼,將1次* 23每次返回後每iterations.But它沒有滿足我需求。

在第一次迭代中,它將返回1 * 23的值,然後我會選擇最大的一個,例如,它是s[8]。而當前迭代s[8]將不會從Y[i] * X[i] * logistic(-Y[i] * np.dot(X[i], w))更新。在這個迭代中,如果Y[i] * X[i] * logistic(-Y[i] * np.dot(X[i], w))中的第8個元素是最大的,那麼在下一次迭代中s[9]將不會被更新。我如何更改我的代碼?

+0

IS X和Y的長度是否相同? –

+0

不完全理解你的問題。如果在當前迭代中s [8]'是最大值,那麼在下一次迭代中,要獲得s [0],s [1],s [2] ... s [7],0, s [9] ...',沒有s [8]? –

+0

是,s [8]保留上次迭代計算的值 – liumilan

回答

0

簡要說明k_range!=max_idx使得數組具有:1其中索引不等於先前的最大索引並且0其中索引等於先前的最大索引。在第一次迭代期間,max_idx爲-1,因此k_range!=max_idx給出1的數組。

def gradient_testing(X,Y,w): 
    K = len(w) 
    N = len(X) 
    s = np.zeros(K) 
    max_idx=-1 
    k_range=np.arange(K) 

    for i in range(N): 
     _temp_max= Y[i] * X[i] * logistic(-Y[i] * np.dot(X[i], w)) 
     s+=_temp_max*(k_range!=max_idx) 
     max_idx=np.argmax(_temp_max) 

    s = -1 *s/N 
    return s