我实现了逻辑回归并将其应用于一个数据集。(这是Coursera机器学习课程第三周的一项练习,通常使用Matlab和Octave,而我使用的是Python,所以这不算作弊)。
我从sklearn
的实现开始,用于对本课程第三周使用的数据集进行分类(http://pastie.org/10872959)。这里有一个小的、可复现的示例,供任何人尝试我使用的方法(它仅依赖于numpy
和sklearn
):
它获取数据集,将其分成特征矩阵和输出矩阵,然后从原始的2个特征构造出另外26个特征(即从
)。然后我使用
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(即与项相关的系数)
以及它生成的轮廓图:
一个潜在的错误来源是我误解了存储在trial._coeff
中的7×4矩阵系数。我认为这28个值是上述28个“变体”的系数,我已经将系数映射到变体上,既按列也按行。按列的意思是[:][0]
映射到前7个变体,[:][1]
映射到接下来的7个,依此类推,我的函数constructVariations
解释了变体是如何系统地创建的。现在API维护trial._coeff
中存储了一个shape (n_classes, n_features)
的数组,所以我应该推断fit
将数据分类为四个类别吗?还是我在处理这个问题时在其他方面做得不好?
更新
我对权重的解释(和/或使用)肯定有问题:
我没有依赖sklearn
内置的预测,而是尝试自己计算使以下值等于1/2的值
theta的值是从打印trial._coeff
中找到的,x和y是标量。然后这些x,y被绘制出来以生成轮廓图。
我使用的代码(但最初没有添加)试图做到这一点。它的数学原理有什么问题?
回答: