吴恩达机器学习笔记第六章逻辑回归分析以及代码实现

本文详细解释了在机器学习中如何使用sigmoid函数归一化数据,调整代价函数以避免多重极小值,并通过Matlab实现梯度下降法求解θ。作者分享了偏导数求解过程和数据预处理步骤,展示了线性回归模型的实际应用。
摘要由CSDN通过智能技术生成

第六章对线性代数和导数的要求比之前几章是要高一些的,对于对应的数学知识点我会在下方顺便仔细地指出来并在能力范围内给予一定的推导,尽量保证各位能明白不用再查来查去的,不用重蹈我的覆辙😂,我本人对于一些概念也是不清楚,查这些东西也花了好一段时间,所以这一章的笔记没有在昨天更新出来。

首先我们来看这个图,很明显它是把数据点进行了一个分类,数据的分布有点离散的味道在里面,假如我们按照常规的线性回归的话就会出现答案值远大于1的情况,这个情况不好判断,这里我们需要做的是把这个函数h\left ( \theta \right )进行一个归一化,这个函数的归一化,老师在ppt里面是采用了一个sigmoid函数

sigmoid函数:\frac{1}{1+e^{-x}}    这个函数值的范围很明显是在(0,1]这里面,让h\left ( \theta \right )等于这个函数也就实现了归一化,(即h\left ( \theta \right )=\frac{1}{1+e^{-\theta ^{T}x}})

图像大概是这样子

然后我们设好h\left ( \theta \right )后,就可以设我们的代价函数

假如只是简单地用h\left ( \theta \right )-y,那就会出现图像有多个极小值的情况,这样梯度下降的时候就容易找不到真正的最低点,所以老师在ppt里换了一种设置方法

然后我们就得到了我们的代价函数是

接下去我们就要对这个函数进行求偏导,去求\frac{\partial J\left ( \theta \right )}{\partial \theta }这个值,然后才能进而得到一个反复更新θ的式子

\theta _{j}=\theta _{j}-\alpha \frac{\partial J\left ( \theta \right )}{\partial \theta_{j} }

该偏导的详细推导过程我已经放到我的另一篇博客里面了,感兴趣的话可以了解一下

吴恩达机器学习笔记之第六章中代价函数的化简与梯度下降公式结果推导-CSDN博客

偏导求出来的式子是

求出来这个式子推导之后,我们的理论准备工作也差不多了,进入实战环节(matlab启动!!)

正式地工作之前我们就老样子导数据

load ex2data1.txt
x=[ones(100,1),ex2data1(:,1:2)]';
y=ex2data1(:,3);
x(2,:)=(x(2,:)-mean(x(2,:)))./std(x(2,:))   
%对x的值进行归一化,可以提升梯度下降的速度,也能减少一点过大数据造成的误差,拟合的更准确
x(3,:)=(x(3,:)-mean(x(3,:)))./std(x(3,:))
%下方就会展示这个归一化的原理

首先std是求该矩阵的标准差,

σ=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/n ),这是总体标准差的一个公式,原来的式子就相当于\frac{x^{j}-u}{\sqrt{(\sum_{i=1}^{n}(x^{i}-u)^{2})/n}}=\sqrt{\frac{(x^{j}-u)^{2}n}{\sum_{i=1}^{n}(x^{i}-u)^{2}}}这样子就很明显,我们确确实实实现了一个把样本点数据缩小的目的,也算是一种归一化或者可以说是一种特征缩放,接下来就是对theta值的一个确定

theta=zeros(3,1)
theta_k=theta
for i=1:200000
theta=theta-0.0001/47*((exp(-theta_k'*x+1)'.^(-1)-y)'*(x'))';
theta_k=theta;
end

然后进入画图环节

scatter3(x(2,:),x(3,:),y)   %把原数据点在三维图里展示出来
hold on
x_p=min(min(x(2,:),min(x(3,:)))):0.001:max(max(x(2,:),max(x(3,:))));     
y_p=min(min(x(2,:),min(x(3,:)))):0.001:max(max(x(2,:),max(x(3,:))));
%提前设置好画plot3所需要的x,y,这保证了画出来的线一定是条曲线而不是歪七扭八的
sz=size(x_p,2)
x=[ones(1,sz);x_p;y_p]
plot3(x_p,y_p,(exp(-theta_k'*x)+1)'.^(-1)')
hold off

这就是最终拟合出来的一个曲线,可以看出来这个函数确实可以比较有效地对数据进行分类,我觉得三维图可能表现的更加具体和形象,但是假如兄弟想看平面的那也可以,我接下来就展示在下方

for i=1:size(y,1)
    if y(i) == 1
        scatter(x(2,i),x(3,i),"red")
        hold on
    else
        scatter(x(2,i),x(3,i),"blue")     %对数据点进行区分
    end
end
x_p=min(min(x(2,:),min(x(3,:)))):0.001:max(max(x(2,:),max(x(3,:))));
%设置好我们x的范围,即下方函数的定义域
plot(x_p,(-(theta(1)+theta(2)*x_p))/theta(3))x_2
这个为什么x_2是等于这个式子,下方就会展示我的推导过程
hold off

首先我们明确一下原来的函数里,假如我们拟合的直线可以很好的对数据点进行分类,那么就说明我们的代价函数J\left ( \theta \right )对θ在我们求出来的点的偏导值很小,那么我们不妨令\frac{\partial J\left ( \theta \right )}{\partial \theta }=\alpha,且α是一个很小的值并且可正可负,即h\left ( \theta \right )=\frac{1}{1+e^{-\theta ^{T}x}}=y+\alpha

我们再把h\left ( \theta \right )展开:h\left ( \theta \right )=\frac{1}{1+e^{-\theta _{1}-\theta _{2}x_{1}-\theta _{3}x_{2}}}=y+\alpha,然后我们对该等式进行一系列变换:e^{-\theta _{1}-\theta _{2}x_{1}-\theta _{3}x_{2}}=\frac{1}{y+\alpha }-1

-\theta _{1}-\theta _{2}x_{1}-\theta _{3}x_{2}=ln(\frac{1}{y+\alpha }-1)

-(ln(\frac{1}{y+\alpha }-1)+\theta _{1}+\theta _{2}x_{1})/\theta _{3}=x_{2}

我上方代码是粗略地把y+α当作了0.5处理,但效果也还好,我们看一下图(大家也可以把y+α处理一下)

还行吧哈哈哈哈哈哈,内容差不多就这样了,以上的推导如果发现有误的话希望各位指正或者私信,拜托,谢谢各位哥哥姐姐😭❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值