开始
Posted ekux127
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开始相关的知识,希望对你有一定的参考价值。
现代C++语言由三部分组成:
- 低级语言,大部分继承自C语言。
- 现代高级语言特性,允许我们定义自己的类型以及组织大规模程序和系统。
- 标准库,它利用高级特性来提供有用的数据结构和算法。
一个函数的定义包含四部分:返回类型、函数名、形参列表、函数体。
main函数的返回类型必须为int。
1.2初识输入输出
iostream库包括两个基础类型istream和ostream,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出或者写入IO设备的。
标准输入输出对象
标准库定义了4个IO对象。
梦开始的地方,从最小二乘法开始学机器学习
梦开始的地方,从最小二乘法开始学机器学习
从这篇博客开始,我们将逐步实现不同的机器学习代码,以此来深入学习了解不同的机器学习背后的原理~
文章目录
00. 参考资料
我们的参考书有如下:
- [周志华老师的《机器学习》](机器学习 (豆瓣) (douban.com))
- [《南瓜书》](南瓜书PumpkinBook (datawhalechina.github.io))
- [李航老师的《统计学习方法》](统计学习方法(第2版) (豆瓣) (douban.com))
01. 从线性回归问题开始
西瓜书正式开始讲机器学习算法便是从这里入手的,所以这里也就是我们启航的地方。
线性模型几乎是大部分人接触的第一个机器学习模型,它形式非常的简单,所以这也是我们的第一站。那么首先我们需要明白,线性回归问题是一个回归问题, 回归问题多是处理连续值的,又或者可以理解为:尽量的画出一条线,让结果都尽量的离这条线越近越好。
与此相反的,分类问题就是来处理离散值的,也就是去将结果尽量地通过我们画的线区分开来。
所以该怎么去区分回归还是分类?当然是通过我们的需求了。
02. 线性回归的问题提出
一句话来总结,线性回归就是想办法让所有点到线的距离之和最小化。
所以我们该如何去解决这个问题?这就是最小二乘法的作用了。
我们通常见到的一个数学公式来描述一条直线的,通常会是这样:
f
(
x
)
=
w
x
+
b
f(x)=wx+b
f(x)=wx+b
其中w代表我们变量前的系数,b代表截距,又或者我们在这里称它为偏执。
我们将以下的点代入进去:
x = [1, 3, 5, 8, 11, 15]
y = [1, 7, 12, 20, 26, 36]
绘图看一下结果:
如果是我们来画一条线的画,我们可以非常轻松的画出一个大致差不多的答案:
但是当数据量多了起来,当数据维度多了起来,我们又该怎么办了呢?
就如同周志华老师书中的那个公式一样:
f
(
x
)
=
w
1
x
1
+
w
2
x
2
+
…
+
w
d
x
d
+
b
f(x)=w_1x_1+w_2x_2+ \\ldots +w_dx_d+b
f(x)=w1x1+w2x2+…+wdxd+b
通过向量的方式,我们可以将公式转换成如下:
f
(
x
)
=
w
T
x
+
b
f(x)=w^Tx+b
f(x)=wTx+b
怎么样通过计算机,来找出这样一条线,就是我们今天所需要去做的。
03. 线性回归问题的数学理论推导
我们之前说过,线性回归就是为了所有点到线的距离之和最小化。所以我们以最基础的 f ( x ) = w x + b f(x)=wx+b f(x)=wx+b来展开推导:
所以我们需要得到的结果就是让得到一个让每个点竖直到直线的值最小。即我们将每个点到直线的公式可以写成这样:
d
i
s
t
a
n
t
=
∣
f
(
x
)
−
y
∣
distant = |f(x)-y|
distant=∣f(x)−y∣
其中f(x)是我们预测的线上的点,而y是离散的点的y坐标,也就是实际结果。
随后我们需要将所有点的distant之和最小:
d
i
s
t
a
n
t
_
s
u
m
=
a
r
g
min
∑
i
=
1
m
∣
f
(
x
i
)
−
y
i
∣
distant\\_sum = arg\\min \\sum _i=1^m|f(x_i)-y_i|
distant_sum=argmini=1∑m∣f(xi)−yi∣
但是在这里,我们如果通过绝对值的方式就很难再继续展开求解,因为我们没有办法去求导了。于是有什么办法在不改变数值特性的情况下,又方便求导呢?我们将绝对值替换成了平方的方式,完美的解决了这个问题~
d
i
s
t
a
n
t
_
s
u
m
2
=
a
r
g
min
∑
i
m
(
f
(
x
i
)
−
y
i
)
2
distant\\_sum^2 = arg \\min \\sum _i^m(f(x_i)-y_i)^2
distant_sum2=argmini∑m(f(xi)−yi)2
接下来我们将
f
(
x
)
f(x)
f(x)展开看看吧:
d
i
s
t
a
n
t
_
s
u
m
2
=
a
r
g
m
i
n
∑
i
=
1
m
(
y
i
−
ω
x
i
−
b
)
2
distant\\_sum^2 = arg min\\sum _i=1^m(y_i- \\omega x_i-b)^2
distant_sum2=argmini=1∑m(yi−ωxi−b)2
接下来我们我们就要开始秀了!
不知道大家是否还记得偏导呢?在百度百科中,它的定义如下:
在数学中,一个多变量的函数的偏导数,就是它关于其中一个变量的导数而保持其他变量恒定(相对于全导数,在其中所有变量都允许变化)。如果大家忘记怎么算了,可以先去回顾一下,这里不做详细介绍了。
于是我们将偏导运用进来,就可以求出不同变量的最小值点了!于是我赶快写下了求导公式:
∂
E
(
w
,
b
)
∂
w
=
2
(
w
∑
i
=
1
m
x
i
2
−
∑
i
=
1
m
(
y
i
−
b
)
x
i
)
∂
E
(
w
,
b
)
∂
b
=
2
(
m
b
−
∑
i
=
1
m
(
y
i
−
w
x
i
)
)
\\frac \\partial E_(w,b) \\partial w=2(w \\sum _i=1^mx_i^2- \\sum _i=1^m(y_i-b)x_i)\\\\\\frac \\partial E_(w,b) \\partial b=2(mb- \\sum _i=1^m(y_i-wx_i))
∂w∂E(w,b)=2(wi=1∑mxi2−i=1∑m(yi−b)xi)∂b∂E(w,b)=2(mb−i=1∑m(yi−wxi))
公式推导详见南瓜书~建议先自己手推一下,这个难度不高。
随后我们再看,我们现在希望让偏导的结果都为0,于是我们把等号左边置零。这个时候上面的那个公式存在着w和b两个未知数,一看就不是现在可以解的,于是我们可以先求解对b求偏导的结果。
于是我们得到了这样的公式: 以上是关于开始的主要内容,如果未能解决你的问题,请参考以下文章
b
=
1
m
∑
i
=
1
m
(
y
i
−
ω
x
i
)
b= \\frac1m \\sum _i=1^m(y_i- \\omega x_i)
b=m1i=1∑m(yi−ωxi)
将b的结果作为已知值代入w中计算,于是也可以求解出公式如下:
w
=
∑
i
=
1
n
y
i
(
x
i
−
x
‾
)
∑
i
=
1
m
x
i
2
−
1
m
(
∑
i
=
1
m
x
i
)
2
w= \\frac \\sum _i=1^ny_i(x_i- \\overlinex) \\sum _i=1^mx_i^2- \\frac1m( \\sum _i=1^mx_i)^2
w=∑i=1mxi2−m1(∑