版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cdknight_happy/article/details/84980001
1 二分类
m样本数目,n样本特征数目
建议使用的符号表示
X=⎣⎢⎢⎢⎢⎡∣ x(1) ∣∣ x(2) ∣⋯∣ x(m) ∣⎦⎥⎥⎥⎥⎤∈Rn×m y=[y(1)y(2)⋯y(m)]∈R1×m
2 logistic regression
二分类算法,目的是最小化预测结果和真实结果之间的误差。
给定
x∈Rn,目的是得到
y^=P(y=1∣x),0≤y^≤1。
输入:
x∈Rn;
输出:
y∈{0,1};
参数:
W∈Rn;
偏置:
b∈R;
输出:
y^=σ(WTx+b)
激活函数:sigmoid,
σ(x)=1+e−x1
z→+∞,σ(z)→1;
z→−∞,σ(z)→0;
z=0,σ(z)=0.5。
3 logistic regresstion cost function
loss function:在单个样本上定义的损失,衡量的是在单个训练样本上的表现;
cost function:在整个训练集上定义的损失,衡量的是在整个训练集上的表现。
logistic regression loss function:
L(y(i),y^(i))=−(y(i)log(y^(i))+(1−y^(i))log(1−y^(i)))
y(i)=0,L(y(i),y^(i))=−log(1−y^(i)),为了尽可能减小
L(y(i),y^(i)),需要
1−y^(i)越大越好,也就是需要
y^(i)越小越好,而
y^(i)∈{0,1},因此,即希望
y^(i)=0;
y(i)=1,L(y(i),y^(i))=−log(y^(i)),为了尽可能减小
L(y(i),y^(i)),需要
y^(i)越大越好,而
y^(i)∈{0,1},因此,即希望
y^(i)=1。
训练样本集的cost function:
J(W,b)=m1∑i=1mL(y(i),y^(i))=−m1∑i=1m[y(i)log(y^(i))+(1−y^(i))log(1−y^(i))]
训练logistic regression模型时,目的是找到cost function最小时的W和b。
为什么代价函数是这个样子呢?
对于logistic regression,已知模型给出的是当前样本属于正样本的预测概率;如果当前单个训练样本的ground truth=1,则
p(y∣x)=y^;若当前单个训练样本的ground truth=0,则
p(y∣x)=1−y^。对于正样本而言,我们希望模型预测该样本为正样本的概率越大越好,即
y^越大越好;而对于负样本,我们希望模型预测该样本为负样本的概率越大越好,即
1−y^越大越好,同样是
y^越大越好。因此,把这两种情况合并起来,得到了表达式:
p(y∣x)=y^y+(1−y^)(1−y)
对于上式,若y=1,则
p(y∣x)=y^;若y=0,则
p(y∣x)=1−y^。和原来的预期结果是一致的。
由于对于m个样本组成的训练集来说,样本之间独立同分布,所以为了求得一组参数使得这一组样本的估计值都尽可能的准确,我们需要使该样本集的联合概率越大越好,即最大化
Πi=1mp(y(i)∣x(i))。而由于log函数为单独递增函数,最大化
Πi=1mp(y(i)∣x(i))和最大化
logΠi=1mp(y(i)∣x(i))可以得到同样的最优解,但是把乘积运算变成了求和运算,计算更加简单。因此,目的就变成了最大化
logΠi=1mp(y(i)∣x(i)),也就是极大似然估计。
而对于代价函数来说,我们目的是要最小化它的,因此,这里加一个符号,变成最小化
−logΠi=1mp(y(i)∣x(i))。而添加一个系数
m1纯粹是为了计算方便。
综上,我们最终想要最小化的代价函数为:
J(W,b)=m1∑i=1mL(y(i),y^(i))=−m1∑i=1m[y(i)log(y^(i))+(1−y^(i))log(1−y^(i))]
4 梯度下降
随机初始化参数,得到一个初始的J(W,b),在每一点处沿着梯度最大的方向前进,逐步减小J(W,b)的值,下降路径如上图红色箭头所示。最终收敛到全局最优解。
最优解右侧,梯度大于0,减梯度,w向左侧移动;
最优解左侧,梯度小于0,减梯度,w向右侧移动。
更新规则:
repeat
{
w := w -
α dw
b := b -
α db
}
5 计算图
6 logistic regression梯度计算
基于m个样本进行logistic regression的训练:
初始化:
J=0;dW1=0;dW2=0;db=0;
单次梯度下降更新:
for i=1 to m:
z(i)=WTx(i)+b
a(i)=σ(z(i))
J+=−[y(i)log(a(i))+(1−y(i))log(1−a(i))]
dz(i)=a(i)−y(i)
dW1+=dz(i)x1
dW2+=dz(i)x2
db+=dz(i)
J/=m
dW1/=m
JW2/=m
W1=W1−α dW1
W2=W2−α dW2
b=b−α db
两个缺点:一是需要遍历所有的样本(i = 1 … m),第二是需要遍历所有的特征(
dW1,dW2),计算量太大。
解决办法:用向量化代替for循环。
7 向量化
向量化代替第二个for循环:
向量化替代两个for循环,这里体现了将X表示成列向量形式矩阵的好处:
上图右侧保留的for循环表示进行1000次的梯度下降,该for循环没有办法再通过向量化进行消除。
8 python广播
python中numpy的reshape操作很高效,可以在计算之前进行reshape保证对正确大小的矩阵进行处理。
不要用shape为(n,)的秩为1的数组;多使用assert确保变量的shape是正确的;reshape开销很小,可以用来改变变量的排列shape。
9 作业
numpy中,* 和 np.multiply 表示逐元素相乘;np.dot(a,b)表示矩阵乘积;np.outer(a,b)表示向量的外积。
math.exp(x)表示对标量x进行指数运算,其无法对list进行运算;但是,np.exp([1,2,3])的输出为[
e1,e2,e3]。
计算范数,||x|| = np.linalg.norm(x,ord=2,axis=0,keepdims=True);
训练样本排列时,将每一个样本组成一个列向量。
对于形状为(a,b,c,d)的数组,可以使用
x_flatten = x.reshape((a,-1)).T 将其变换成 (bcd,a)的形状。