作业说明
任务一:使用逻辑回归辨别真假钞票。钞票数据集(Banknote Dataset)涉及根据给定钞票的数个度量的照片预测是真钞还是假钞。它是一个二分类问题。每个类的观测值数量不均等。4个输入变量和1个输出变量。变量名如下:
变量名1:小波变换图像(连续)
变量名2:小波偏斜变换图像(连续)
变量名3:小波峰度变换图像(连续)
变量名4:图像熵(连续)。
类(0 为真钞,1 为假钞)
任务二:使用逻辑回归对电影评论分类。电影评论数据集和之前贝叶斯的电影数据集相同。
复习
逻辑回归,在西瓜书里面称为对数几率回归,logistic regression,logit regression。实际上就是线性回归加了一个sigmoid函数。
z
=
w
T
x
+
b
z=\mathbf{w} ^{T} \mathbf{x}+b
z=wTx+b
y
=
s
i
g
m
o
i
d
(
z
)
=
1
1
+
e
−
z
=
1
1
+
e
−
(
w
T
x
+
b
)
y=sigmoid(z)=\frac{1}{1+e^{-z }}=\frac{1}{1+e^{-(\mathbf{w} ^{T} \mathbf{x}+b )}}
y=sigmoid(z)=1+e−z1=1+e−(wTx+b)1
任务一:使用逻辑回归辨别真假钞票
首先是从txt文件中读取数据并向量化。然后用梯度下降法不断迭代得到最优参数。上代码
def gradient(x, xt, y):
m, n = x.shape
y = y.reshape(-1, 1)
alpha = 0.001
deta = 0.000001
maxcycle = 500
beta = np.ones((n, 1))
for i in range(maxcycle):
h = sigmoid(np.matmul(x, beta))
error = y - h
tem = beta
beta = beta + alpha * np.matmul(xt, error)
if abs(sum(beta - tem)) < deta:
break
print(i)
return beta
beta就是
w
w
w和
b
b
b的拼接结果,即
β
=
(
w
;
b
)
\beta =(\mathbf{w};b)
β=(w;b),
w
T
x
+
b
=
β
T
x
^
,
x
^
=
(
x
;
1
)
\mathbf{w} ^{T} \mathbf{x}+b=\beta^{T}\mathbf{\hat{x}},\mathbf{\hat{x}}=(\mathbf{x};1)
wTx+b=βTx^,x^=(x;1)。这个代码写的不太行,对numpy库非常不熟悉,导致我函数入口参数既传了矩阵又传了矩阵的转置,而且运行慢
剩下的就是用公式去预测结果然后保存成csv文件
任务二:使用逻辑回归对电影评论分类
在这里有一个问题,就是梯度下降法的实现。走在路上想往最低处走总有多种路线。任务一就是一种梯度下降,但是很慢,效果感觉也不太行。我记得当时我编程作业到这里时处于一种非常迷惑的状态,因为连续好几个任务都不给测试集标签对比训练成果(后来才想起可以把训练集割掉一部分不训练,专门拿来验证)。
看看别人的梯度下降,多简洁
def stoc_grad_ascent(dataMatIn, classLabels):
m, n = np.shape(dataMatIn)
alpha = 0.01
weights = np.ones(n)
for i in range(m):
h = sigmoid(sum(dataMatIn[i] * weights)) # 数值计算
error = classLabels[i] - h
weights = weights + alpha * error * dataMatIn[i]
print(i)
return weights
水完了,今晚上不写了,凑合着看