监督学习是利用数据的特征和标签来训练一个模型,使模型能够对任意给定的输入,对其相应的输出做出一个好的预测,即得出一个所谓的正确答案。监督学习可以分为两大类:回归分析和分类,二者之间的区别在于回归分析针对的是连续数据,而分类针对的是离散数据。
非监督学习为直接对数据进行建模,训练数据中只有特征没有标签,而且事先并不知道输入数据对应的输出结果是什么,最终结果为多个结构。。其中包含聚类分析与特征变量关联等算法。即类似于将一个数据集分为多个集合,而事先并不知道集合的种类与个数,如将新闻按照相同的事件分组。
也就是Cost function 和Loss function就差在有没有把预测值和真实值的差异求和再取平均
也就是loss函数累积成cost函数
损失函数(Loss function) 是定义在 单个训练样本上的 ,也就是就算一个样本的误差
代价函数(Cost function) 是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均
机器学习中大部分问题都是优化问题,而绝大部分优化问题都可以用梯度下降法来解决,最终找到可以使cost函数值最小的θ(参数)的值,应用于minimizeing的cost函数的过程
梯度方向是函数值增加最快的方向,梯度的反方向是函数值减小最快的方向。
但梯度下降容易出现陷入局部最优的问题
Mean normalization(均值归一化)特征归一化(特征缩放) 在有多个feature使,可以使梯度下降更高效,简单来说就是把每个数据大约的约束在[-1, 1]之间
当然若一个feature在[0, 3]或[-1, 0.5]之间的话也不需要归一化,因为他已经大约约束在[-1, 1]之间了;若一个feature在[-100, 300]或[-0.0001, 0.00001]之间则需要考虑归一化了
公式有:
x
i
=
x
i
−
μ
x
m
a
x
−
x
m
i
n
x_i=frac{x_i-mu}{x_{max}-x_{min}}
xi=xmax−xminxi−μ
x
i
=
x
i
−
μ
s
t
d
x_i=frac{x_i-mu}{std}
xi=stdxi−μ
如何判断梯度下降是否正常运作(cost函数是否已经收敛)特征缩放和均值归一化的作用都是为了减小样本数据的波动使得梯度下降能够更快速的寻找到一条‘捷径’,从而到达全局最小值。
- ①通过绘图,如下图左边,当在300-400时差不多已经收敛,此时在梯度下降意义已经不大
- ②通过设置自动检测参数,如下图右边,先设置一个收敛标准,当变化值小于它时就停止迭代
一般使用绘图这个方法,因为它可以提醒我们,算法是否在正常工作,还可以通过它来调整 α alpha α(步长)
- 若cost函数值在上升,就需要使用更小的 α alpha α(步长),如下图一
- 若cost函数值一会下降,一会上升,就需要使用更小的
α
alpha
α(步长),如下图二
数学家已经证明只要学习率
α
alpha
α足够小,那在每次迭代后cost函数的值就一定会下降,但是若太小了就会降低梯度下降的效率
所以可以尝试如下图的
α
alpha
α取值
最小二乘法(又称最小平方法)可用于误差估计、曲线拟合,是一种数学优化技术。它通过最小化残差平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间的残差平方和为最小。
- 线性参数的最小二乘法处理程序可归结为:首先根据具体问题列出误差方程式;再按最小二乘法原理,利用求极值的方法将误差转化为正规方程;然后求解正规方程,得到待求的估计量;最后给出精度估计。
- 对于非线性参数,可先将其线性化,然后按上述线性参数的最小二乘法处理程序去处理。因此,建立正规方程是待求参数最小二乘法处理的基本环节
方程为:
θ
=
(
X
T
X
)
−
1
X
T
y
theta=(X^TX)^{-1}X^Ty
θ=(XTX)−1XTy
正规方程根据最小二乘法原理得到的关于参数估计值的线性方程组。最小二乘法则可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程(或称为法方程)。
其原因可能是:
- 方阵中的两个维度之间存在线性变换关系,导致方阵不满秩;解决方法:删除其中一个维度即可
- n(特征数量)相较于m(样本数量)过大,导致方阵不满秩;解决方法:删除一些维度或正则化即可
| 梯度下降 | 正规方程 |
|---|---|
| 需要选择学习速率 α alpha α,当然如果不设置也会有默认值 | 不需要 |
| 需要多次迭代 | 一次求解得出 |
| 当特征数量n大时也能比较好的适用 | 需要计算
(
X
T
X
)
−
1
(X^TX)^{−1}
(XTX)−1 如果特征数量N较大则运算代价大,因为矩阵的逆的计算时间复杂度为 O ( n 3 ) O(n^3) O(n3) 通常来说当n小于10000时还是可以接受的 |
| 适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
简单来说如果特征变量小于10000的话基本使用正规方程,若超出10000则基本使用梯度下降
Batch gradient descentBatch gradient descent 就是一次迭代训练所有样本,就这样不停的迭代。
mini-batch gradient descent 是batch gradient descent和stochastic gradient descent的折中方案,就是mini-batch gradient descent每次用一部分样本来更新参数,即 batch_sizebatch_size。因此,若batch_size=1batch_size=1 则变成了SGD,若batch_size=mbatch_size=m 则变成了batch gradient descent。batch_sizebatch_size通常设置为2的幂次方,通常设置2,4,8,16,32,64,128,256,5122,4,8,16,32,64,128,256,512(很少设置大于512)。因为设置成2的幂次方,更有利于GPU加速。现在深度学习中,基本上都是用 mini-batch gradient descent,(在深度学习中,很多直接把mini-batch gradient descent(a.k.a stochastic mini-batch gradient descent)简称为SGD,所以当你看到深度学习中的SGD,一般指的就是mini-batch gradient descent)。
stochastic gradient descent为了加快收敛速度,并且解决大数据量无法一次性塞入内存(显存)的问题,stochastic gradient descent(SGD)就被提出来了,SGD的思想是每次只训练一个样本去更新参数。
矩阵使用矩阵的好处有:简化编写的代码程序,有利于提高计算机的运算效率
三、其他概念解释 方差方差为每个样本值与全体样本值的平均数之差的平方值的平均数,它是用来度量随机变量和其数学期望(即均值)之间的偏离程度。
算术平均数是加权平均数的一种特殊形式(特殊在各项的权重相等)。在实际问题中,当各项权重不相等时,计算平均数时就要采用加权平均数;当各项权相等时,计算平均数就要采用算术平均数。
加权平均值即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。
它是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。
- 数学期望和加权平均值求出来的结果值是一样的。
- 加权平均值是一个统计学的概念,而期望是一个概率论的概念。
- 加权平均值是实验后根据实际结果统计得到的样本的值;期望是实验前根据概率分布“预测”的样本值。
- 可以理解为期望就是加权平均值随样本趋于无穷的极限。
- 他们通过大数定律连接起来,期望可以代表事情的本质。
详细内容点击查看网站
平均差它是指各个变量值同平均数的离差绝对值的算术平均数。
平均差异大,表明各标志值与算术平均数的差异程度越大,该算术平均数的代表性就越小;平均差越小,表明各标志值与算术平均数的差异程度越小,该算术平均数的代表性就越大。
是方差的算术平方根,标准差能反映一个数据集的离散程度。
均方误差是评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
为了明确解释变量和随机误差各产生的效应是多少,统计学上把数据点与它在回归直线上相应位置的差异称为残差,把每个残差平方之后加起来 称为残差平方和,它表示随机误差的效应。一组数据的残差平方和越小,其拟合程度越好。
对于图形的凸函数来说,局部最优就是全局最优
四、代码编写 Pandas中的loc与iloc用法详解loc函数:第一个参数通过行索引 “Index” (前闭后闭)中的具体值来取行数据,第二个参数来取列
iloc函数:通过行号来取行数据(前闭后开),第二个参数来取列
注:loc是location的意思,iloc中的i是integer的意思,仅接受整数作为参数。
dataframe.shapeshape可获得dataframe是什么类型的矩阵(m*n),shape[0]获得行数,shape[1]获得列数
np.mat和np.matrix的区别对于np.mat() 而言,如果输入本身就是一个矩阵,则np.mat不会对该矩阵make a copy,仅仅是创建了一个新的引用。相当于np.matrix(data, copy = False),所以当创建新矩阵时,只要修改这两者中的任何一个,两个矩阵都会改变。
而对于np.matrix() 而言,默认为np.matrix(data, copy = True),创建了一个新的相同的矩阵。当创建新矩阵时,原来的矩阵不会改变。两者之间除了长相相同以外,没有任何瓜葛。
dataframe.values:对应的二维NumPy值数组。
dataframe.columns:列索引(列名称)。
dataframe.index:行的索引(行号或行名)。
# 创建矩阵
a = np.matrix([[1, 2, 3],
[4, 5, 6]])
# 转置
a.transpose()
a.T
# 输出矩阵
matrix([[1, 4],
[2, 5],
[3, 6]])
加减法
# 创建矩阵
a = np.matrix([[1, 2, 3],
[4, 5, 6]])
# 加减
a + a
a - a
# 输出矩阵
matrix([[ 2, 4, 6],
[ 8, 10, 12]])
matrix([[0, 0, 0],
[0, 0, 0]])
乘法
# 创建矩阵
a = np.matrix([[1, 2, 3],
[4, 5, 6]])
# 数乘、矩阵相乘
2 * a
a * a.T
np.dot(a, a.T)
# 输出矩阵
matrix([[ 2, 4, 6],
[ 8, 10, 12]])
matrix([[14, 32],
[32, 77]])
matrix([[14, 32],
[32, 77]])
注意:矩阵积计算不遵循交换律,np.dot(x,y) 和 np.dot(y,x) 得到的结果是不一样的。
单位矩阵np.eye(3)
array([[1., 0., 0.], # 输出
[0., 1., 0.],
[0., 0., 1.]])
方阵的迹
a = np.matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
np.trace(a)
15 # 输出
方阵的行列式
a = np.matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
np.linalg.det(a)
-9.51619735392994e-16 # 输出
方阵的逆
a = np.matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
np.linalg.inv(a)
# 输出
matrix([[ 3.15251974e+15, -6.30503948e+15, 3.15251974e+15],
[-6.30503948e+15, 1.26100790e+16, -6.30503948e+15],
[ 3.15251974e+15, -6.30503948e+15, 3.15251974e+15]])
伴随矩阵
np.linalg.inv(a) * np.linalg.det(a)
# 输出
matrix([[ -3., 6., -3.],
[ 6., -12., 6.],
[ -3., 6., -3.]])
np.power()
power(x, y) 函数,计算 x 的 y 次方。详情跳转
np.sum()axissum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue)
如果axis默认/缺失,即将数组/矩阵中的元素全部加起来
axis为0是压缩成行,即将每一列的元素相加,将矩阵压缩为一行
axis为1是压缩成列,即将每一行的元素相加,将矩阵压缩为一列
a = np.matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
np.sum(a) # 输出45
np.sum(a, axis = 0) # 输出matrix([[12, 15, 18]])
np.sum(a, axis = 1) # 输出matrix([[ 6],
# [15],
# [24]])
dtype
dtype先将a转化后再相加
np.sum([0.5, 0.7, 1.2, 1.5], dtype=np.int32) # 输出为2 np.sum([0.5, 0.7, 1.2, 1.5], dtype=np.float32) # 输出为3.9keepdims
keepdims =True 将保持b的维度
# 此时b为二维数组 np.sum(b, axis = 0 ,keepdims = True)ravel() 和 flatten()
可以看到这两个函数实现的功能一样(将多维数组降位一维),但我们在平时使用的时候flatten()更为合适。在使用过程中flatten()分配了新的内存,但ravel()返回的是一个数组的视图。视图是数组的引用(说引用不太恰当,因为原数组和ravel()返回后的数组的地址并不一样),在使用过程中应该注意避免在修改视图时影响原本的数组。具体解释:
# 传入'F'参数表示列序优先
>>> x = np.array([[1, 2], [3, 4]]) # 原数组
>>> x.flatten('F')
>>> array([1, 3, 2, 4]) # 列优先
>>> x.ravel('F')
>>> array([1, 3, 2, 4]) # 列优先
>>> x = np.array([[1, 2], [3, 4]]) # 原数组
>>> a = x.flatten() # 摊平
>>> a[1] = 100 # 修改值
>>>> a
array([ 1, 100, 3, 4]) # 修改后的数组
>>> x
array([[1, 2], # 原数组(未发生变动)
[3, 4]])
>>> x = np.array([[1, 2], [3, 4]]) # 原数组
>>> a = x.ravel() # 摊平
>>> a[1] = 100 # 修改值
>>> a
array([ 1, 100, 3, 4]) # 修改后的数组
>>> x
array([[ 1, 100], # 原数组(发生变动)
[ 3, 4]])
np.zeros()
返回来一个给定形状和类型的用0填充的数组
zeros(shape, dtype=float, order=‘C’)
np.zeros((2,5))
# 输出
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
print(np.zeros((2,5),dtype= int))
# 输出
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
python中np.multiply()、np.dot()、星号(*)和@运算符的区别
详情跳转
np.multiply()np.dot()数组和矩阵对应位置相乘,输出与相乘数组/矩阵的大小一致
星号(*)对于秩为1的数组,执行对应位置相乘,然后再相加
对于秩不为1的二维数组,执行矩阵乘法运算
对于矩阵,则运行矩阵的乘法
@运算符对数组执行对应位置相乘
对矩阵执行矩阵乘法运算
numpy.linspace是矩阵的乘法运算符
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
它是在指定的间隔内返回均匀间隔的数字。
Matplotlib使用教程(两种)- 面向对象:直接创建画布和坐标轴,并调用其中的方法(object-oriented style)
# OO style fig, ax = plt.subplots(figsize=(13,6)) # Create a figure and an axes. ax.plot(x, y1, label='Quadratic') # Plot some data on the axes. ax.plot(x, y2,label='20Sin(x)') # Plot more data on the axes... ax.plot(x, y3, label='20Cos(3x)') # ... and some more. ax.legend() plt.show()
- 面向plt:依赖matplotlib.Pyplot直接画图并且改变相应的特征值。
# pyplot style
plt.figure(figsize=(13,6))
plt.plot(x, y1, label='Quadratic') # Plot some data on the (implicit) axes.
plt.plot(x, y2, label='20Sin(x)')
plt.plot(x, y3, label='20Cos(3x)')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot--Pyplot style")
plt.legend()
plt.show()
np.arange()
函数返回一个有终点和起点的固定步长的排列,并且
参数有三种情况:
- 一个参数时,参数值为终点,起点取默认值0,步长取默认值1。
- 两个参数时,第一个参数为起点,第二个参数为终点,步长取默认值1。
- 三个参数时,第一个参数为起点,第二个参数为终点,第三个参数为步长。其中步长支持小数
注意:而区间都是前闭后开
本文用于个人学习与记录,侵权立删



