无法获得我的逻辑回归实现中系数的正确轮廓图?

我实现了逻辑回归并将其应用于一个数据集。(这是Coursera机器学习课程第三周的一项练习,通常使用Matlab和Octave,而我使用的是Python,所以这不算作弊)。

我从sklearn的实现开始,用于对本课程第三周使用的数据集进行分类(http://pastie.org/10872959)。这里有一个小的、可复现的示例,供任何人尝试我使用的方法(它仅依赖于numpysklearn):

它获取数据集,将其分成特征矩阵和输出矩阵,然后从原始的2个特征构造出另外26个特征(即从

enter image description here)。然后我使用sklearn中的逻辑回归,但这并未生成所需的轮廓图(请见下文)。

from sklearn.linear_model import LogisticRegression as expitimport numpy as npdef thetaFunc(y, theta, x):    deg = 6    spot = 0    sum = 0    for i in range(1, deg + 1):    for j in range(i + 1):        sum += theta[spot] * x**(i - j) * y**(j)        spot += 1    return sumdef constructVariations(X, deg):    features = np.zeros((len(X), 27))     spot = 0    for i in range(1, deg + 1):        for j in range(i + 1):            features[:, spot] = X[:,0]**(i - j) * X[:,1]**(j)            spot += 1    return featuresif __name__ == '__main__':    data = np.loadtxt("ex2points.txt", delimiter = ",")    X,Y = np.split(data, [len(data[0,:]) - 1], 1)    X = reg.constructVariations(X, 6)    oneArray = np.ones((len(X),1))    X = np.hstack((oneArray, X))    trial = expit(solver = 'sag')    trial = trial.fit(X = X,y = np.ravel(Y))    print(trial.coef_)    # 以下所有内容已被编辑    from matplotlib import pyplot as plt    txt = open("RegLogTheta", "r").read()    txt = txt.split()    theta = np.array(txt, float)    x = np.linspace(-1, 1.5, 100)    y = np.linspace(-1,1.5,100)    z = np.empty((100,100))    xx,yy = np.meshgrid(x,y)    for i in range(len(x)):         for j in range(len(y)):             z[i][j] = thetaFunc(yy[i][j], theta, xx[i][j])    plt.contour(xx,yy,z, levels = [0])    plt.show()

以下是通用特征项的系数。http://pastie.org/10872957(即与项enter image description here相关的系数)

以及它生成的轮廓图:


一个潜在的错误来源是我误解了存储在trial._coeff中的7×4矩阵系数。我认为这28个值是上述28个“变体”的系数,我已经将系数映射到变体上,既按列也按行。按列的意思是[:][0]映射到前7个变体,[:][1]映射到接下来的7个,依此类推,我的函数constructVariations解释了变体是如何系统地创建的。现在API维护trial._coeff中存储了一个shape (n_classes, n_features)的数组,所以我应该推断fit将数据分类为四个类别吗?还是我在处理这个问题时在其他方面做得不好?enter image description here


更新

我对权重的解释(和/或使用)肯定有问题:

我没有依赖sklearn内置的预测,而是尝试自己计算使以下值等于1/2的值

enter image description here

enter image description here

theta的值是从打印trial._coeff中找到的,x和y是标量。然后这些x,y被绘制出来以生成轮廓图。

我使用的代码(但最初没有添加)试图做到这一点。它的数学原理有什么问题?


回答:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注