1

现在我已经实现了python代码。

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 矩阵,Y是 80*1 矩阵。从我的代码中,每次迭代后它都会返回 1*23。但它不满足我的要求。

在第一次迭代中,它会返回 1*23 的值,然后我会选择最大的一个,例如,它是s[8]. 而当前的迭代,s[8]将不会从Y[i] * X[i] * logistic(-Y[i] * np.dot(X[i], w)). 在本次迭代中,如果第 8 个元素Y[i] * X[i] * logistic(-Y[i] * np.dot(X[i], w))最大,则在下一次迭代s[9]中不会更新。如何更改我的代码?

4

1 回答 1

0

简要说明,k_range!=max_idx使数组具有:1where index 不等于先前最大值的索引,并且0index 等于先前最大值的索引。在第一次迭代中,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
于 2013-09-30T04:18:38.893 回答