python - 线性回归和自动求导

标签 python numpy machine-learning mathematical-optimization

设 $F\in\mathbb{R}^{S\times F}$ 为特征矩阵,我想使用带有 autograd 的逻辑回归对它们进行分类 [1]。我使用的代码类似于以下示例 [2] 中的代码。

我唯一想要改变的是,我在 $\mathbb{R}^{F\times L}$ 中有一个额外的权重矩阵 $W$,我想将其应用于每个特征。因此,每个特征都与 $W$ 相乘,然后输入到逻辑回归中。

是否可以使用 autograd 同时训练 $W$ 和逻辑回归的权重?

我尝试了以下代码,不幸的是权重保持在值 0。

import autograd.numpy as np
from autograd import grad

    global inputs

    def sigmoid(x):
        return 0.5 * (np.tanh(x) + 1)


    def logistic_predictions(weights, inputs):
        # Outputs probability of a label being true according to logistic model.
        return sigmoid(np.dot(inputs, weights))


    def training_loss(weights):
        global inputs
        # Training loss is the negative log-likelihood of the training labels.

        feature_weights = weights[3:]
        feature_weights = np.reshape(feature_weights, (3, 3))

        inputs = np.dot(inputs, feature_weights)

        preds = logistic_predictions(weights[0:3], inputs)
        label_probabilities = preds * targets + (1 - preds) * (1 - targets)

        return -np.sum(np.log(label_probabilities))


    # Build a toy dataset.
    inputs = np.array([[0.52, 1.12, 0.77],
                       [0.88, -1.08, 0.15],
                       [0.52, 0.06, -1.30],
                       [0.74, -2.49, 1.39]])

    targets = np.array([True, True, False, True])

    # Define a function that returns gradients of training loss using autograd.
    training_gradient_fun = grad(training_loss)

    # Optimize weights using gradient descent.
    weights = np.zeros([3 + 3 * 3])
    print "Initial loss:", training_loss(weights)
    for i in xrange(100):
        print(i)
        print(weights)
        weights -= training_gradient_fun(weights) * 0.01

    print  "Trained loss:", training_loss(weights)

[1] https://github.com/HIPS/autograd

[2] https://github.com/HIPS/autograd/blob/master/examples/logistic_regression.py

最佳答案

典型的做法是将所有“向量化”参数连接到决策变量向量中。

如果您更新 logistic_predictions 以包含 W 矩阵,通过类似

def logistic_predictions(weights_and_W, inputs):
    '''
    Here, :arg weights_and_W: is an array of the form [weights W.ravel()]
    '''
    # Outputs probability of a label being true according to logistic model.
    weights = weights_and_W[:inputs.shape[1]]
    W_raveled = weights_and_W[inputs.shape[1]:]
    n_W = len(W_raveled)
    W = W_raveled.reshape(inputs.shape[1], n_W/inputs.shape[1])

    return sigmoid(np.dot(np.dot(inputs, W), weights))

然后只需将 traning_loss 更改为(来自原始源示例)

def training_loss(weights_and_W):
    # Training loss is the negative log-likelihood of the training labels.
    preds = logistic_predictions(weights_and_W, inputs)
    label_probabilities = preds * targets + (1 - preds) * (1 - targets)
    return -np.sum(np.log(label_probabilities))

关于python - 线性回归和自动求导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43117417/

相关文章:

python - 组合模型时不考虑批量尺寸

machine-learning - 使用 libLinear 进行分类的后期融合步骤

python - 类型错误 : unsupported operand type(s) for +: 'dict_items' and 'dict_items'

python - 未找到 Token.objects

用于操作非常大的矩阵的 Python 库

python - 如何使 matplotlib/pandas 条形图看起来像直方图?

python - 如何在 MatPlotLib (NumPy) 中绘制多维数据的轮廓?

r - R编程中如何标准化数据集?

python - 如何在 Django 中以编程方式呈现和缓存 View ?

python - 如何为降序值编写排序键函数?