# 【学习人工智能】线型回归和sigmoid回归(附实战)
程序猿
**深度学习篇:线型回归和sigmoid回归**
**本篇难度系数:2星**
本来想给这篇文章写个难度1星,但联想到本人较为弱势的数学,姑且还是给个2星吧。sigmoid回归是logistic回归的一种,而logistic regression和线型回归也是近亲,本质都是一个东西。那么说回归回归,回归是个啥?
其实很好理解,通俗意义上讲,线型回归就是让你找一条直线把两种(或多种)类型的标签分为两类(或多种),**而sigmoid回归就是让你找一条直线,把经过sigmoid化后的输入数据与模型的乘积分成两类。**
有同学立刻问,什么是sigmoid,为什么要用sigmoid。
这个问题要从sigmoid是什么开始说起。
sigmoid函数并不难,就是这么个东西。
![](https://pic3.zhimg.com/80/v2-2a031e558c106978217f90f068d3f152_hd.jpg)
**注意,x可以是数,可以是向量,sigmoid一个向量的意思,就是分别对期中的每一个元素做sigmoid。**那么为什么要搞这么个东西。因为这个东西长这样。
![](https://pic3.zhimg.com/80/v2-a70953eb94c0b143ca236fb7e2ca7192_hd.jpg)
比如你的x>8,那么,那么sigmoid可以基本上把它归为1类,但是如果你的函数是y=x,这个label也就是y可就是8了,这是很不方便的。有同学又说,为什么不搞个符号函数,
![](https://pic4.zhimg.com/80/v2-ece5ff0e4f2fe9767354588932e8a6df_hd.jpg)
这是好问题,答案是,很难求导。又有人问,为什么要求导?我们不用急,接着往下看。
sigmoid回归问题最重要的几个公式:
![](https://pic3.zhimg.com/80/v2-cfb6f8149c9ec2d192c6df3d0932d43e_hd.jpg)
这个好理解,就是一个简单的矩阵相乘公式。这个h是在算概率呢。
那么出现 label = 1的标签的时候,其概率为h,出现 label = 0 的标签的时候,其概率为 1-h,即:
![](https://pic2.zhimg.com/80/v2-01823db4bd5ad7e72f42c50ea5fe44fd_hd.jpg)
因此我们可以得到综合概率函数:
![](https://pic2.zhimg.com/80/v2-92720308c9c1a2a19e69f1639f3ca0b5_hd.jpg)
由这个综合概率函数,我们可以得到似然函数
![](https://pic1.zhimg.com/80/v2-1745d1cc5c4c3a75abb86e44fa050d38_hd.jpg)
这个东西简单,这个东西不就是你把所有的样本给乘起来,我们默认这些样本是独立同分布的。共有m个样本。
下面搞了个对数,为的是化简的时候能把累加乘 (\\Pi) 改成累加加 (\\sum)
![](https://pic1.zhimg.com/80/v2-54d3039a95e7e5aa67338ffd7f763a70_hd.jpg)
然后对这个东西去求导,原谅我实在不想一步一步地去求导了,我直接贴别人的公式了。
![](https://pic4.zhimg.com/80/v2-35adc121181b4bd363504e7502e048eb_hd.jpg)
请注意,上面的theta就是我自己公式里面的W,这是一个东西。**这里应该有一个问题,那就是我们为什么要对 J 去求导,我们可以基本上认为,J就代表那个似然函数,我们当然希望我们的模型可以尽最大的可能性去往 J 上去贴,换句话说,我们希望我们的模型尽可能的准,也就是求最大值,而导数可以帮我们逐步地找到这个最大值。**
![](https://pic2.zhimg.com/80/v2-b3af16d21270b9def06dbd7d7033304d_hd.jpg)
这个公式是元素的形式,对我们来说还是太复杂了,我们把它转化一下。
![](https://pic3.zhimg.com/80/v2-0aeda42dce7bbc779a54e279466475ea_hd.jpg)
于是,更新公式为:
![](https://pic1.zhimg.com/80/v2-540a908db260adb1b75596593baea1dc_hd.jpg)
**对于编程来说,我们需要这个就够了。**
**(1)one hot**
首先我们写一个 make one hot 函数:
~~~text
def make_one_hot(data1, out):
return (np.arange(out)==data1[:,None]).astype(np.integer)
~~~
这个函数有什么用?比如说你的输入是 y = \[1,0,1\].T
他会给你转变成:
~~~text
[[0 1]
[1 0]
[0 1]]
~~~
没看出规律我们再来一个:
y = \[1,2,4,0\].T
他会给你转变成:
\[\[0 1 0 0 0\]
\[0 0 1 0 0\]
\[0 0 0 0 1\]
\[1 0 0 0 0\]\]
这回应该看出规律了吧。
**(2) sigmoid**
~~~python3
def sigmoid( x):
return 1.0/(1+np.exp(-x))
~~~
没什么可说的。
**(3) logistic regression**
~~~python3
def logisticRegression(x, y):
m,n = np.shape(x)
alpha = 0.001
maxCycles = 5000
w = np.ones((n,2))
for k in range(maxCycles):
h = sigmoid(x.dot(w))
error = (h - y)
w = w - alpha * x.transpose().dot(error)
return w
~~~
![](https://pic1.zhimg.com/80/v2-540a908db260adb1b75596593baea1dc_hd.jpg)
**请注意这句话(数学公式)在代码中哪一个位置出现**。编程是容易的,因为我们仅仅使用数学推导的结论就可以了。注意:m是常数,我们直接用\\alpha 去替代 \\alpha/m, 这是没有问题的。
**(4)准确率检测**
~~~text
def acc(xs,ys,w):
p = sigmoid(xs.dot(w))
p = np.argmax(p,1)
s = 0
for i in range(len(p)):
if p[i] == np.argmax(ys[i]):
s += 1
return s/len(p)
~~~
也没什么可以说的,就是比对吻合的样本除以总数的百分比。
总结一下,其实logistic regression最核心的东西就是对**极大似然**和**梯度下降**的这两个东西的运用。**而极大似然的本质就是根据样本也就是x的分布规律虚拟出一个模型出来**。(这个模型是现实中不存在的,但是人们认为这个模型存在所以使得样本符合某种规律),然后我们又通过 **梯度下降** 的方法不断地微调我们的模型 W 能够使得似然概率尽可能的大,而且似然函数我是存在一个极大值点的,也就是我们输出的logit能尽可能的吻合真正的label。当梯度下降过程收敛的时候,我们的模型达到了最优的情况,从而达到有效分类的目的,这就是逻辑回归的本质。
**另外:那些注重学术探讨的人,懂得就事论事的人是朋友,是会受到欢迎的人;那些自己什么有价值的东西都说不出来,在一旁指点江山的人是渣滓,是会被社会淘汰的**