ValueError:形状(2,100)和(2,1)不对齐:100(dim 1)!= 2(dim 0)

时间:2019-09-30 16:50:11

标签: python machine-learning logistic-regression

我正在做机器学习作业,并且在计算Logistic回归下降梯度和Logistic回归成本。 我的功能是这样的:

def calcLogRegressionCost(X, y, theta):
    #X is the feature vector
    #Y is the target vector/ output vector
    #theta is the weight vector 

    observations = len(y)
    predictions = sigmoid(np.dot(X, theta))

    #Take the error when label=1
    class1_cost = -y*np.log(predictions)

    #Take the error when label=0
    class2_cost = (1-y)*np.log(1-predictions)

    #Take the sum of both costs
    cost = class1_cost + class2_cost

    #Take the average cost
    cost = cost.sum() / observations

    return cost



def logRegressionGradientDescent(X, y, theta0, alpha):
    #X is the feature vector
    #Y is the target vector/ output vector
    #theta0 is the weight vector 
    #alpha is the learning rate
    #iteration is the steps you want to take 
    #Start you code from here\


    N = len(X)

    #1 - Get Predictions
    predictions = sigmoid(np.dot(X, theta0))

    #2 Transpose features from (100, 2) to (2, 100)
    # So we can multiply w the (100,1)  cost matrix.
    # Returns a (2,1) matrix holding 3 partial derivatives --
    # one for each feature -- representing the aggregate
    # slope of the cost function across all observations
    gradient = np.dot(X.T,  predictions - y)

    #3 Take the average cost derivative for each feature
    gradient /= N

    #4 - Multiply the gradient by our learning rate
    gradient *= lr

    #5 - Subtract from our weights to minimize cost
    weights -= gradient

    #you should return theta or loss or the both depending on your way
    #of implementation

    return weights

他们要求我运行“梯度下降算法”以使我的参数θ适合我的训练集。我做了一个火车功能,如下:

W1 = 0.0
W2 = 0.0
weights = np.array([
    [W1],
    [W2]
])


def train(features, labels, weights, lr, iters):
    cost_history = []

    for i in range(iters):
        weights = logRegressionGradientDescent(features, labels, weights, lr)

        #Calculate error for auditing purposes
        cost = cost_function(features, labels, weights)
        cost_history.append(cost)

        # Log Progress
        if i % 1000 == 0:
            print ("iter: " +str(i) + " cost: "+str(cost))

    return weights, cost_history


train([data['First Exam Score'], data['Second Exam Score']], data['Admitted'], weights, 0.00001, 1000)

当我使用数据调用函数训练时,会出现以下错误:

ValueError:形状(2,100)和(2,1)不对齐:100(dim 1)!= 2(dim 0)

我不确定如何使参数适合我的数据集。数据集是100 x 3数据框。前两列是第一和第二次考试中分别获得的100年级学生的数据。第三列显示他们是否根据所希望的大学录取而被录取。用0或1表示。

1 个答案:

答案 0 :(得分:1)

  

当我使用数据调用函数训练时,它会给我以下内容   错误:

     

ValueError:形状(2,100)和(2,1)未对齐:100(dim 1)!= 2   (昏暗0)

作为程序员,您必须记住的一件事是,错误消息对于调试非常重要。它们为您提供了有关逻辑或代码容易出现故障或已经发生故障的位置的重要信息。 如果您阅读错误消息,则可以注意以下事项:

  1. 由于错误提到未对齐的形状,并且我们知道形状与向量和矩阵相关联,所以问题似乎与特征矩阵和权重矩阵的维数有关传递到您的逻辑回归函数中。
  2. 错误消息中提到未对齐,这可能表示矩阵乘法可能存在问题,因为如果矩阵的维数与乘法或其顺序不兼容,则期望未对齐的矩阵会引发此错误倍增使操作不可行。

到现在,您可能已经意识到错误指向特征矩阵 X 和权重向量θ的Numpy点积。
为了解决此错误,您将必须确保两件事:矩阵形状兼容以执行矩阵乘法,并且乘法顺序正确。请记住,在逻辑回归中,特征矩阵中的每个观测都需要一个标量输出,可以将其作为自变量进一步传递到诸如sigmoid函数的概率映射中,以向您提供该特定实例属于一个概率的概率。给定的课程。

错误解决方案

为解决此问题,转置特征矩阵 X ,使其形状变为(100,2)。在对特征矩阵进行转置之后,点积应该变得可行,从而解决您遇到的错误。

建议创建一个单独的要素矩阵,矩阵 X ,其中仅包含要素列,而不包含目标列,后者是数据的最后一列。还建议创建标签向量 y ,该标签向量仅存储标签或目标类列。如果我这样做的话,那么我将在Pandas中做所有事情,但是由于您正在与Numpy合作,因此您可以按照以下方式进行操作。

X = np.transpose([(data['First Exam Score'], data['Second Exam Score']]) #Reshapes the feature matrix from (2,100) to (100,2)
y = data['Admitted']

train(X, y, weights, 0.00001, 1000)

您会注意到,这种方式使代码更具可读性,并且减少了遇到错误的机会。 希望这会有所帮助。