21.10.18-21.10.24
周学习任务:
100% 回顾吴恩达机器学习前4章节
10% 神经网络学习
机器学习:用已知的数据集通过数学模型使得程序能够像人一样的去思考,然后对未知数据做出预测
分类问题
以及回归问题
。for
循环来进行两个参数的选择,但是计算出的值与真实值之间会存在误差,我们需要对误差进行获取以及得到最优的参数值,所以引入了代价函数==进行误差的分析。代价函数:在回归模型中,使用 J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( 预 测 值 h θ ( x i ) − 真 实 值 y i ) 2 样 本 数 据 数 量 m J(\theta{_0},\theta{_1})=\frac{1}{2m}\sum_{i=1}^{m}\frac {(预测值h{_\theta{}}(x_{i})-真实值y{_i})^2}{样本数据数量m} J(θ0,θ1)=2m1∑i=1m样本数据数量m(预测值hθ(xi)−真实值yi)2来作为其代价函数,如下通过 θ 1 \theta{_1} θ1的变化,求得对应 θ 1 = 1 \theta{_1}=1 θ1=1时有最小的代价函数值。当对下图右边进行求导时 ∂ J ( θ 1 ) ∂ θ 1 \frac {\partial J(\theta{_1})}{\partial \theta{_1}} ∂θ1∂J(θ1),会发现越靠近最优解时,其偏导数是越靠近0的。
梯度下降:为了使得参数变化和代价函数关联起来,使用 θ j : = θ 1 − α ∂ J ( θ 0 , θ 1 ) ∂ θ j \theta{_j}:=\theta{_1}-\alpha \frac{\partial J(\theta{_0},\theta{_1})}{\partial \theta{_j}} θj:=θ1−α∂θj∂J(θ0,θ1)对各个参数进行同步改值,其中== α \alpha α==为学习率,太大太小均不可。梯度下降的过程中,接近最优解的时候,偏导数会越来越接近0,那步长也就会越来越小,最终达到合适的权重值。一下为梯度下降算法的流程。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_california_housing as fch #加州房价预测数据
#数据的提取
feature=fch().data
target=fch().target
#数据的拆分
x_train,x_text,y_train,_y_test=train_test_split(feature,target,test_size=0.1,random_state=2021)
linear=LinearRegression() #模型初始化
#模型的训练
linear.fit(x_train,y_train)
#得到权重参数值 linear.coef_
#打印权重参数名以及参数值
[*zip(fch().feature_names,linear.coef_)]
可以看到值越小的参数对最后的预测值影响越小。
模型的评估:使用==MSE(均方误差)==来衡量真实值和预测值之间的差异,其实就是loss函数
回归模型的评价指标
from sklearn.metrics import mean_squared_error
y_true=y_test #将真实值存到y_true中
y_pred=linear.predict(x_test) #通过模型对测试数据集中的数据进行预测
mean_squared_error(y_true,y_pred)#MSE值0.5253224455144776
#使用交叉验证中的均方误差
from sklearn.model_selection import cross_val_score
cross_val_score(linear,x_train,y_train,cv=5,scoring='neg_mean_squared_error').mean()
#loss(损失值)-0.5284704303001286正数就为MSE
拟合图
#绘制拟合图
%matplotlib inline
import matplotlib.pyplot as plt
y_pred=linear.predict(x_test)
plt.plot(range(len(y_test)),sorted(y_test),c="black",label="y_true")
plt.plot(range(len(y_pred)),sorted(y_pred),c="red",label="y_predict")
plt.legend()
plt.show
当mse越接近0的时候,数据将会更加的拟合
在使用线性回归梯度下降的时候,其中 θ \theta θ的值是通过代价函数反复确定,增加了循环地次数,在矩阵的运算中,我们可以一次使用多组数据作为参数,求出多组不同的预测值。所以当函数方程存在多个输入参数时,方便求解。引入矩阵时为了后面的正规方程寻最优解
特征缩放:当数据很大的时候,为了方便计算,我们可以将简单的有规律的数值进行特征缩放,使得我们的梯度下降的更快,收敛也更快。
监控代价函数:为了监控是否达到最小,可以使用执行次数和代价函数值画出图像就行监控。一般可以使用一个阈值进行自动收敛测试。代价函数也有有很大部分收学习率的影响,所以我们也要通过合适的算法选取合适的学习率
正规方程
梯度下降核心:通过对代价函数求偏导,得到近似0的值(等于0就是类似于极值的求解),最终得到合适的参数
正规方程核心:利用矩阵的运算:$\theta X=Y 通 过 矩 阵 的 变 换 ( 转 置 , 逆 矩 阵 等 ) 得 到 通过矩阵的变换(转置,逆矩阵等)得到 通过矩阵的变换(转置,逆矩阵等)得到\theta$的值
求得 θ = ( X T X ) − 1 X T Y \theta=(X^TX)^{-1}X^T Y θ=(XTX)−1XTY (考虑是否可逆:一般均可在octave中用pinv算出,inv只能算不可逆的)
不可逆的情况:特征值之间有关系比例
奇异矩阵或者退化矩阵:存在多余的feature
让程序像大脑一样思考,模拟大脑的神经传递,将参数通过一层一层的映射关系传递到最后得到最终的结果
当某一个模型中输入参数变得很大的时候,如图像中的像素块分解作为参数,使用常规的模型会使得计算量变得很大。
存在一组数据有海量数据,我们需要将这里面的数据进行多个分类,其最终的预测值不止一个。
21.10.25-21.10.31
周学习任务:
100% 回顾吴恩达机器学习:分类算法
80% 神经网络学习
机器学习:用已知的数据集通过数学模型使得程序能够像人一样的去思考,然后对未知数据做出预测
分类问题
以及回归问题
。衡量模型预测错误的程度,我们取整个数据集上的平均对数似然损失,我们可以得到代价函数为:
即
J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) ln h θ ( x ( i ) ) + ( 1 − y ( i ) ) ln ( 1 − h θ ( x ( i ) ) ) ] J(\theta)=- \frac{1}{m}[\sum_{i=1}^my^{(i)}\ln h_\theta(x^{(i)})+(1-y^{(i)})\ln(1-h_\theta(x^{(i)}))] J(θ)=−m1[∑i=1my(i)lnhθ(x(i))+(1−y(i))ln(1−hθ(x(i)))]
= − 1 m [ ∑ i = 1 m y ( i ) ( θ T x ) − ln ( 1 + e θ T x ) ] - \frac{1}{m}[\sum_{i=1}^my^{(i)} (\theta^Tx)-\ln(1+e^{\theta ^T x})] −m1[∑i=1my(i)(θTx)−ln(1+eθTx)]
在逻辑回归模型中,最大化似然函数和最小化损失函数实际上是等价的。
梯度下降:为了使得参数变化和代价函数关联起来,使用 θ j : = θ j − α ∂ J ( θ ) ∂ θ j \theta{_j}:=\theta{_j}-\alpha \frac{\partial J(\theta)}{\partial \theta{_j}} θj:=θj−α∂θj∂J(θ)对各个参数进行同步改值,其中== α \alpha α==为学习率,太大太小均不可。梯度下降的过程中,接近最优解的时候,偏导数会越来越接近0,那步长也就会越来越小,最终达到合适的权重值。一下为梯度下降算法的流程。
对代价函数求偏导得到:KaTeX parse error: Undefined control sequence: \part at position 8: \frac {\̲p̲a̲r̲t̲ ̲J(\theta)}{\par…
正则化是一个通用的算法和思想,所以会产生过拟合现象的算法都可以使用正则化来避免过拟合.
在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,可以有效提高泛化预测精度。如果模型过于复杂,变量值稍微有点变动,就会引起预测精度问题。正则化之所以有效,就是因为其降低了特征的权重,使得模型更为简单
正则化一般会采用 L1 范式或者 L2 范式
类似于正规方程中加入某一矩阵:
逻辑回归的正则化
L1 正则化就是在 loss function 后边所加正则项为 L1 范数,加上 L1 范数容易得到稀疏解(0 比较多)。
L2 正则化就是 loss function 后边所加正则项为 L2 范数的平方,加上 L2 正则相比于 L1 正则来说,得到的解比较平滑(不是稀疏),但是同样能够保证解中接近于 0(但不是等于 0,所以相对平滑)的维度比较多,降低模型的复杂度。
让程序像大脑一样思考,模拟大脑的神经传递,将参数通过一层一层的映射关系传递到最后得到最终的结果
前一个参数计算出值后作为后一个公式的参数值
a j ( l ) a_j^{(l)} aj(l)表示第 l l l层的 j j j个结点的激活值,这个值通过激活函数==sigmod(z)==计算得到。
z 1 2 = θ 0 + θ 1 x 1 1 + θ 2 x 2 1 z_1^{2}=\theta_0 +\theta_1 x_1^1+\theta_2 x_2^1 z12=θ0+θ1x11+θ2x21 第二层的z由第一层权重和 z z z通过激活函数sigmod得 a 2 a^2 a2 。 下图为计算 z 3 z^3 z3的图像。
δ j ( l ) \delta_j^{(l)} δj(l)代表了第 l l l层的 j j j个结点的误差 δ j ( l ) = a j l − y j \delta_j^{(l)}=a_j^{l}-y_j δj(l)=ajl−yj (激活项的误差)。同时也可以写成向量的形式: δ l = a ( l ) − y \delta^{l}=a^{(l)}-y δl=a(l)−y
上图公式含义:第三层的误差== δ 3 \delta^3 δ3== 是第三层参数== θ \theta θ==的转置乘以 第四层的误差项向量 点乘 激活函数g在输入值为 z 3 z^3 z3时所求的导数最后的值为如下图所示,同时误差层数不能算到第一层因为是输入层,没有意义。
实际上得到某一层的代价函数的偏导就等于 该层激活项乘以下一层的误差值。
上图中得到其误差为cost对z的偏导,其含义:衡量的是为了影响这些中间值,我们改变神经网络中的权重的程度,进而影响输出函数h(x),并影响所有的代价函数
计算 δ 2 ( 2 ) = θ 12 ( 2 ) δ 1 ( 3 ) + θ 22 ( 2 ) δ 2 ( 3 ) \delta_2^{(2)}=\theta_{12}^{(2)} \delta_1^{(3)}+\theta_{22}^{(2)} \delta_2^{(3)} δ2(2)=θ12(2)δ1(3)+θ22(2)δ2(3) 其中 δ 2 ( 3 ) = θ 12 ( 3 ) δ 1 ( 4 ) \delta_2^{(3)}=\theta_{12}^{(3)} \delta_1^{(4)} δ2(3)=θ12(3)δ1(4)
取消了直接利用求导的法则去运算,而使用微分的概念去近似求值来对神经网络最后的模型进行梯度检测,确认梯度下降是正确的。在执行梯度下降的时候不要执行检测算法,因为检测算法的运算时间很慢。
在使用梯度下降等算法的时候,我们需要对 θ \theta θ 的值进行初始化,然后再进行梯度下降,所以就要选择合适的初始化值。
可以将数据集拆分成30%-70%比例,或者详细分为:训练集,交叉集,验证集。
使用交叉集cv误差来选择模型。使用train训练模型,通过梯度下降之后,得到较好的参数;再使用cv数据集将这个参数代入,求出cv误差。
图像:多项式的次数和训练误差的图像,以及交叉误差的函数图像。
在使用正则化的过程中,我们需要考虑 λ \lambda λ 的取值;通过一点一点的变化使得交叉集的误差最低。
学习曲线只要是检查我们的算法是否正常,是出于偏差还是方差
案例:参数越多的时候,交叉验证会越好,但是训练集的误差会变大
import numpy as np
import matplotlib.pyplot as plt
#数据的载入
data=np.genfromtxt("data.csv",delimiter=",")
x_data=data[:,0] #数据的切分
y_data=data[:,1]
plt.scatter(x_data,y_data)#数据的散点图
plt.show()
#学习率
lr=0.0001
#截距
b=0
#斜率
k=0
#最大的迭代次数
epochs=50
#最小二乘法 求代价函数
def compute_error(b,k,x_data,y_data):
totalError=0
for i in range(0,len(x_data)):
totalError+=(y_data[i]-(k*x_data[i]+b))**2
return totalError/float(len(x_data))/2.0
#梯度下降算法
def gradient_descent_runner(x_data,y_data,b,k,lr,epochs):
#计算总的数据量
m=float(len(x_data))
#循环
for i in range(epochs):
b_grad=0
k_grad=0
#计算梯度的总和再求平均
for j in range(0,len(x_data)):
#对theta0求导
b_grad+=-(1/m)*(y_data[j]-(k*x_data[j]+b))
#对theta1求导
k_grad+=-(1/m)*x_data[j]*(y_data[j]-(k*x_data[j]+b))
b-=(lr*b_grad)
#参数-学习率*偏导数
k -= (lr*k_grad)
#每一次迭代求出参数1和2的值
#每5次打印对应的图像
# if i%5==0:
# print("epochs:",i)
# plt.plot(x_data,y_data,'b.')
# plt.plot(x_data,k*x_data+b,'r')
# plt.show()
return b,k
print("Starting b={0},k={1},error={2}".format(b,k,compute_error(b,k,x_data,y_data)))
print("running...")
b,k=gradient_descent_runner(x_data,y_data,b,k,lr,epochs)
print("After{0} iterations b={1},k={2},error={3}".format(epochs,b,k,compute_error(b,k,x_data,y_data)))
#画图
plt.plot(x_data,y_data,'b.')
plt.plot(x_data,k*x_data+b,'r')
plt.show(
21.11.1-21.11.6
周学习任务:
支持向量机是在二分类的问题中找到一个最有把握把两类样本分开的一个超平面(最优超平面), 既然是最优问题,就需要先把找最优超平面的问题用数学的方式表示出来,得到了原始的优化目标(SVM原始问题),但是该原始问题对于参数会有约束,不太好求出最优超平面,于是转成无约束问题,并借助凸优化的相关理论把其转成等价的对偶问题,最后通过求对偶问题的解得到最终的超平面。
优点:
缺点:
当训练集Y=1的时候,要想上面的值为0,则cost1=0的时候,z>=1
当训练集Y=0的时候,要想上面的值为0,则cost0=0的时候,z<=-1
当C很大的时候:使得内部值为0
下面的案例是多个直线划分正负样本,存在蓝色线的margin,叫SVM的间距,具有鲁棒性(越大越好),最大分类器
当c非常大的时候,会将黑线变成紫线,但是紫线的情况非常不好,C的作用类似于KaTeX parse error: Undefined control sequence: \y at position 2: 1\̲y̲ ,C不是很大的时候,可能会得到黑线
回顾向量内积:根据毕达哥拉斯定理会得到向量积
两个向量的乘积: V*U的乘积,实际上是P在V在U上的投影乘以u的范数。V*U=P*||u||
u是一个向量,可以理解为参数的向量(x为 θ 1 \theta_1 θ1,y轴为 θ 2 \theta_2 θ2),V向量位置可以理解为样本的位置,样本对u向量做投影,会存在为正为负的情况,就是正样本和负样本,其划分线是u的垂线。
向量的范数:
θ 0 \theta_0 θ0为0的时候,从原点出发,x的位置在 θ \theta θ的投影就是 p i p^i pi 然后其 θ T X i = p i ∣ ∣ θ ∣ ∣ \theta^TX^i=p^i ||\theta|| θTXi=pi∣∣θ∣∣ 值大于1 正样本。类似于 ∣ x ∣ ∗ ∣ θ ∣ ∗ c o s 夹 角 |x|*|\theta|*cos夹角 ∣x∣∗∣θ∣∗cos夹角。
上图具体是指训练样本x在theta上的投影。
向量参数实际上是和 θ \theta θ成正交的。
这里案例是高斯核函数,相似函数,x与标记点之间的位置越近越为1,反之
当标记的值为3.5时,当分母为1时,f的高度约为1。
21.11.8-21.11.14
在原有的监督学习中,无监督学习和监督学习相比监督学习有标签信息,但是无监督学习是没有标签信息的,我们需要使用特有的函数方法使数据集寻找数据中间的内在关系,如将上图分为两个点集(簇)的算法被称为聚类算法。
1. 确定需要分的类数量n
2. 选择K个随机的点,称为***聚类中心*** **cluster centroids**
3. 于数据集中的每一个数据,按照距离$K$个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类
4. 计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。
5. 重复上面步骤,到中心点不在变化
实例:
迭代一次
迭代3次
迭代10次
K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,其中 μ c ( i ) {{\mu }_{{{c}^{(i)}}}} μc(i)代表与 x ( i ) {{x}^{(i)}} x(i)最近的聚类中心点,要找使得代价函数最小的 c ( 1 ) c^{(1)} c(1), c ( 2 ) c^{(2)} c(2),…, c ( m ) c^{(m)} c(m)和 μ 1 μ^1 μ1, μ 2 μ^2 μ2,…, μ k μ^k μk:
J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) = 1 m ∑ i = 1 m ∥ X ( i ) − μ c ( i ) ∥ 2 J(c^{(1)},...,c^{(m)},μ_1,...,μ_K)=\dfrac {1}{m}\sum^{m}_{i=1}\left\| X^{\left( i\right) }-\mu_{c^{(i)}}\right\| ^{2} J(c(1),...,c(m),μ1,...,μK)=m1i=1∑m∥∥∥X(i)−μc(i)∥∥∥2
(1). 闵可夫斯基距离Minkowski/(其中欧式距离: p = 2 p=2 p=2)
d i s t ( X , Y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p dist(X,Y)={{\left( {{\sum\limits_{i=1}^{n}{\left| {{x}_{i}}-{{y}_{i}} \right|}}^{p}} \right)}^{\frac{1}{p}}} dist(X,Y)=(i=1∑n∣xi−yi∣p)p1
(2). 杰卡德相似系数(Jaccard):
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A,B)=\frac{\left| A\cap B \right|}{\left|A\cup B \right|} J(A,B)=∣A∪B∣∣A∩B∣
(3). 余弦相似度(cosine similarity):
n n n维向量 x x x和 y y y的夹角记做 θ \theta θ,根据余弦定理,其余弦值为:
c o s ( θ ) = x T y ∣ x ∣ ⋅ ∣ y ∣ = ∑ i = 1 n x i y i ∑ i = 1 n x i 2 ∑ i = 1 n y i 2 cos (\theta )=\frac{{{x}^{T}}y}{\left|x \right|\cdot \left| y \right|}=\frac{\sum\limits_{i=1}^{n}{{{x}_{i}}{{y}_{i}}}}{\sqrt{\sum\limits_{i=1}^{n}{{{x}_{i}}^{2}}}\sqrt{\sum\limits_{i=1}^{n}{{{y}_{i}}^{2}}}} cos(θ)=∣x∣⋅∣y∣xTy=i=1∑nxi2i=1∑nyi2i=1∑nxiyi
(4). Pearson皮尔逊相关系数:
ρ X Y = cov ( X , Y ) σ X σ Y = E [ ( X − μ X ) ( Y − μ Y ) ] σ X σ Y = ∑ i = 1 n ( x − μ X ) ( y − μ Y ) ∑ i = 1 n ( x − μ X ) 2 ∑ i = 1 n ( y − μ Y ) 2 {{\rho }_{XY}}=\frac{\operatorname{cov}(X,Y)}{{{\sigma }_{X}}{{\sigma }_{Y}}}=\frac{E[(X-{{\mu }_{X}})(Y-{{\mu }_{Y}})]}{{{\sigma }_{X}}{{\sigma }_{Y}}}=\frac{\sum\limits_{i=1}^{n}{(x-{{\mu }_{X}})(y-{{\mu }_{Y}})}}{\sqrt{\sum\limits_{i=1}^{n}{{{(x-{{\mu }_{X}})}^{2}}}}\sqrt{\sum\limits_{i=1}^{n}{{{(y-{{\mu }_{Y}})}^{2}}}}} ρXY=σXσYcov(X,Y)=σXσYE[(X−μX)(Y−μY)]=i=1∑n(x−μX)2i=1∑n(y−μY)2i=1∑n(x−μX)(y−μY)
Pearson相关系数即将 x x x、 y y y坐标向量各自平移到原点后的夹角余弦。
(1). 均一性: p p p
类似于精确率,一个簇中只包含一个类别的样本,则满足均一性。其实也可以认为就是正确率(每个 聚簇中正确分类的样本数占该聚簇总样本数的比例和)
(2). 完整性: r r r
类似于召回率,同类别样本被归类到相同簇中,则满足完整性;每个聚簇中正确分类的样本数占该类型的总样本数比例的和
(3). V-measure:
均一性和完整性的加权平均
V = ( 1 + β 2 ) ∗ p r β 2 ∗ p + r V = \frac{(1+\beta^2)*pr}{\beta^2*p+r} V=β2∗p+r(1+β2)∗pr
(4). 轮廓系数
样本 i i i的轮廓系数: s ( i ) s(i) s(i)
簇内不相似度:计算样本 i i i到同簇其它样本的平均距离为 a ( i ) a(i) a(i),应尽可能小。
簇间不相似度:计算样本 i i i到其它簇 C j C_j Cj的所有样本的平均距离 b i j b_{ij} bij,应尽可能大。
轮廓系数: s ( i ) s(i) s(i)值越接近1表示样本 i i i聚类越合理,越接近-1,表示样本 i i i应该分类到 另外的簇中,近似为0,表示样本 i i i应该在边界上;所有样本的 s ( i ) s(i) s(i)的均值被成为聚类结果的轮廓系数。
s ( i ) = b ( i ) − a ( i ) m a x { a ( i ) , b ( i ) } s(i) = \frac{b(i)-a(i)}{max\{a(i),b(i)\}} s(i)=max{a(i),b(i)}b(i)−a(i)
(5). ARI
数据集 S S S共有 N N N个元素, 两个聚类结果分别是:
X = { X 1 , X 2 , . . . , X r } , Y = { Y 1 , Y 2 , . . . , Y s } X=\{{{X}_{1}},{{X}_{2}},...,{{X}_{r}}\},Y=\{{{Y}_{1}},{{Y}_{2}},...,{{Y}_{s}}\} X={X1,X2,...,Xr},Y={Y1,Y2,...,Ys}
X X X和 Y Y Y的元素个数为:
a = { a 1 , a 2 , . . . , a r } , b = { b 1 , b 2 , . . . , b s } a=\{{{a}_{1}},{{a}_{2}},...,{{a}_{r}}\},b=\{{{b}_{1}},{{b}_{2}},...,{{b}_{s}}\} a={a1,a2,...,ar},b={b1,b2,...,bs}
记: n i j = ∣ X i ∩ Y i ∣ {{n}_{ij}}=\left| {{X}_{i}}\cap {{Y}_{i}} \right| nij=∣Xi∩Yi∣
A R I = ∑ i , j C n i j 2 − [ ( ∑ i C a i 2 ) ⋅ ( ∑ i C b i 2 ) ] / C n 2 1 2 [ ( ∑ i C a i 2 ) + ( ∑ i C b i 2 ) ] − [ ( ∑ i C a i 2 ) ⋅ ( ∑ i C b i 2 ) ] / C n 2 ARI=\frac{\sum\limits_{i,j}{C_{{{n}_{ij}}}^{2}}-\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)\cdot \left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]/C_{n}^{2}}{\frac{1}{2}\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)+\left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]-\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)\cdot \left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]/C_{n}^{2}} ARI=21[(i∑Cai2)+(i∑Cbi2)]−[(i∑Cai2)⋅(i∑Cbi2)]/Cn2i,j∑Cnij2−[(i∑Cai2)⋅(i∑Cbi2)]/Cn2
在PCA中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长读。将 n n n维数据降至 k k k维,目标是找到向量 u ( 1 ) u^{(1)} u(1), u ( 2 ) u^{(2)} u(2),…, u ( k ) u^{(k)} u(k)使得总的投射误差最小
主成分分析与线性回归是两种不同的算法。主成分分析最小化的是投射误差(Projected Error),而线性回归尝试的是最小化预测误差。线性回归的目的是预测结果,而主成分分析不作任何预测。上图中,左边的是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影)。
第一步是均值归一化。我们需要计算出所有特征的均值,然后令 x j = x j − μ j x_j= x_j-μ_j xj=xj−μj如果特征是在不同的数量级上,我们还需要将其除以标准差 σ 2 σ^2 σ2。
第二步是计算协方差矩阵(covariance matrix) Σ Σ Σ:
∑ = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T \sum=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} ∑=m1∑i=1n(x(i))(x(i))T, S i g m a = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T Sigma=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} Sigma=m1i=1∑n(x(i))(x(i))T
第三步是计算协方差矩阵 Σ Σ Σ的特征向量(eigenvectors):
对于一个 n × n n×n n×n维度的矩阵,上式中的 U U U是一个具有与数据之间最小投射误差的方向向量构成的矩阵。如果我们希望将数据从 n n n维降至 k k k维,我们只需要从 U U U中选取前 k k k个向量,获得一个 n × k n×k n×k维度的矩阵,我们用 U r e d u c e U_{reduce} Ureduce表示,然后通过如下计算获得要求的新特征向量 z ( i ) z^{(i)} z(i): z ( i ) = U r e d u c e T ∗ x ( i ) z^{(i)}=U^{T}_{reduce}*x^{(i)} z(i)=UreduceT∗x(i),其中 x x x是 n × 1 n×1 n×1维的,因此结果为 k × 1 k×1 k×1维度。
低维向高维: x x x为2维, z z z为1维, z = U r e d u c e T x z=U^{T}_{reduce}x z=UreduceTx,相反的方程为: x a p p o x = U r e d u c e ⋅ z x_{appox}=U_{reduce}\cdot z xappox=Ureduce⋅z, x a p p o x ≈ x x_{appox}\approx x xappox≈x。
高斯分布,也称为正态分布,例如变量 x x x 符合高斯分布 x ∼ N ( μ , σ 2 ) x \sim N(\mu, \sigma^2) x∼N(μ,σ2)则其概率密度函数为:
p ( x , μ , σ 2 ) = 1 2 π σ exp ( − ( x − μ ) 2 2 σ 2 ) p(x,\mu,\sigma^2)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) p(x,μ,σ2)=2πσ1exp(−2σ2(x−μ)2)
μ μ μ和 σ 2 σ^2 σ2的计算方法如下:对阴影部分积分值为1
μ = 1 m ∑ i = 1 m x ( i ) \mu=\frac{1}{m}\sum\limits_{i=1}^{m}x^{(i)} μ=m1i=1∑mx(i) σ 2 = 1 m ∑ i = 1 m ( x ( i ) − μ ) 2 \sigma^2=\frac{1}{m}\sum\limits_{i=1}^{m}(x^{(i)}-\mu)^2 σ2=m1i=1∑m(x(i)−μ)2
异常检测算法:对于给定的数据集 x ( 1 ) , x ( 2 ) , . . . , x ( m ) x^{(1)},x^{(2)},...,x^{(m)} x(1),x(2),...,x(m),我们要针对每一个特征计算 μ \mu μ 和 σ 2 \sigma^2 σ2 的估计值:
μ j = 1 m ∑ i = 1 m x j ( i ) \mu_j=\frac{1}{m}\sum\limits_{i=1}^{m}x_j^{(i)} μj=m1i=1∑mxj(i) σ j 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2 \sigma_j^2=\frac{1}{m}\sum\limits_{i=1}^m(x_j^{(i)}-\mu_j)^2 σj2=m1i=1∑m(xj(i)−μj)2
获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算 p ( x ) p(x) p(x)
p ( x ) = ∏ j = 1 n p ( x j ; μ j , σ j 2 ) = ∏ j = 1 1 1 2 π σ j e x p ( − ( x j − μ j ) 2 2 σ j 2 ) p(x)=\prod\limits_{j=1}^np(x_j;\mu_j,\sigma_j^2)=\prod\limits_{j=1}^1\frac{1}{\sqrt{2\pi}\sigma_j}exp(-\frac{(x_j-\mu_j)^2}{2\sigma_j^2}) p(x)=j=1∏np(xj;μj,σj2)=j=1∏12πσj1exp(−2σj2(xj−μj)2)
当 p ( x ) < ε p(x) < \varepsilon p(x)<ε时,为异常。
异常检测 | 监督学习 |
---|---|
非常少量的正向类(异常数据 y = 1 y=1 y=1), 大量的负向类( y = 0 y=0 y=0) | 同时有大量的正向类和负向类 |
许多不同种类的异常,非常难。根据非常 少量的正向类数据来训练算法。 | 有足够多的正向类实例,足够用于训练 算法,未来遇到的正向类实例可能与训练集中的非常近似。 |
未来遇到的异常可能与已掌握的异常、非常的不同。 | |
例如: 欺诈行为检测 生产(例如飞机引擎)检测数据中心的计算机运行状况 | 例如:邮件过滤器 天气预报 肿瘤分类 |
今日头条推荐算法详解
21.11.22-21.11.28
CF有两种基本方法:基于用户的协同过滤和基于项目的协同过滤。 步骤:
在协同过滤从算法中,通常不使用方差项,算法会自动学得。
协同过滤优化目标:
给定 θ ( 1 ) , . . . , θ ( n u ) \theta^{(1)},...,\theta^{(n_u)} θ(1),...,θ(nu),估计 x ( 1 ) , . . . , x ( n m ) x^{(1)},...,x^{(n_m)} x(1),...,x(nm):同时最小化 x ( 1 ) , . . . , x ( n m ) x^{(1)},...,x^{(n_m)} x(1),...,x(nm)和 θ ( 1 ) , . . . , θ ( n u ) \theta^{(1)},...,\theta^{(n_u)} θ(1),...,θ(nu):
协同过滤算法使用步骤如下:
初始 x ( 1 ) , x ( 1 ) , . . . x ( n m ) , θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) x^{(1)},x^{(1)},...x^{(nm)},\ \theta^{(1)},\theta^{(2)},...,\theta^{(n_u)} x(1),x(1),...x(nm), θ(1),θ(2),...,θ(nu)为一些随机小值
使用梯度下降算法最小化代价函数
在训练完算法后,我们预测 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i)为用户 j j j 给电影 i i i 的评分
通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为给用户推荐电影的依据。
例如,如果一位用户正在观看电影 x ( i ) x^{(i)} x(i),我们通过两部电影的特征向量之间的距离 ∥ x ( i ) − x ( j ) ∥ \left\| {{x}^{(i)}}-{{x}^{(j)}} \right\| ∥∥x(i)−x(j)∥∥的大小可以寻找另一部电影 x ( j ) x^{(j)} x(j)。
如果我们有一个低方差的模型,增加数据集的规模可以获得更好的结果。我们应该怎样应对一个有100万条记录的训练集?
以线性回归模型为例,每一次梯度下降迭代,我们都需要计算训练集的误差的平方和,如果我们的学习算法需要有20次迭代,这便已经是非常大的计算代价。
首先应该做的事是去检查一个这么大规模的训练集是否真的必要,也许只用1000个训练集也能获得较好的效果,同时可以绘制学习曲线来帮助判断。
如果一定需要一个大规模的训练集,可以使用随机梯度下降法来代替批量梯度下降法。
在随机梯度下降法中,定义代价函数为一个单一训练实例的代价
随机梯度下降算法在每一次计算之后便更新参数 θ {{\theta }} θ ,而不需要首先将所有的训练集求和,在梯度下降算法还没有完成一次迭代时,随机梯度下降算法便已经走出了很远。但是这样的算法存在的问题是,不是每一步都是朝着”正确”的方向迈出的。因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。
小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法,每计算常数 b b b次训练实例,便更新一次参数 θ {{\theta }} θ 。
令 b b b 在 2-100 之间。这样做的好处在于可以用向量化的方式来循环 b b b个训练实例,如果我们用的线性代数函数库比较好,能够支持并行处理,那么算法的总体表现将不受影响(与随机梯度下降相同)。
在批量梯度下降中,我们可以令代价函数 J J J为迭代次数的函数,绘制图表,根据图表来判断梯度下降是否收敛。但是,在大规模的训练集的情况下,这是不现实的,因为计算代价太大了。
每一次更新 θ {{\theta }} θ 之前都计算一次代价,然后每 x x x次迭代后,求出这 x x x次对训练实例计算代价的平均值,然后绘制这些平均值与 x x x次迭代的次数之间的函数图表。
当我们绘制这样的图表时,可能会得到一个颠簸不平但是不会明显减少的函数图像(如上面左下图中蓝线所示)。我们可以增加 α α α来使得函数更加平缓,能看出下降的趋势(如上面左下图中红线所示);或者可能函数图表仍然是颠簸不平且不下降的(如洋红色线所示),那么我们的模型本身可能存在一些错误。
如果我们得到的曲线如上面右下方所示,不断地上升,那么可能会需要选择一个较小的学习率 α α α。
如果有一个由连续的用户流引发的连续的数据流,进入你的网站,我们可以使用一个在线学习机制,从数据流中学习用户的偏好,然后使用这些信息来优化一些关于网站的决策。
一个算法来从中学习的时候来模型化问题在线学习算法指的是对数据流而非离线的静态数据集的学习。许多在线网站都有持续不断的用户流,对于每一个用户,网站希望能在不将数据存储到数据库中便顺利地进行算法学习。
一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。这种方式的好处在于,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。
我们所使用的这个算法与随机梯度下降算法非常类似,唯一的区别的是,我们不会使用一个固定的数据集,我们会做的是获取一个用户样本,从那个样本中学习,然后丢弃那个样本并继续下去,在线学习的一个优点就是,如果有一个变化的用户群,在尝试预测的事情,在缓慢变化,就像你的用户的品味在缓慢变化,这个在线学习算法,可以慢慢地调试你所学习到的假设,将其调节更新到最新的用户行为
映射化简和数据并行对于大规模机器学习问题而言是非常重要的概念。之前提到,如果我们用批量梯度下降算法来求解大规模数据集的最优解,我们需要对整个训练集进行循环,计算偏导数和代价,再求和,计算代价非常大。如果我们能够将我们的数据集分配给不多台计算机,让每一台计算机处理数据集的一个子集,然后我们将计所的结果汇总在求和。这样的方法叫做映射简化。
滑动窗口是一项用来从图像中抽取对象的技术。假使我们需要在一张图片中识别行人,首先要做的是用许多固定尺寸的图片来训练一个能够准确识别行人的模型。然后我们用之前训练识别行人的模型时所采用的图片尺寸在我们要进行行人识别的图片上进行剪裁,然后将剪裁得到的切片交给模型,让模型判断是否为行人,然后在图片上滑动剪裁区域重新进行剪裁,将新剪裁的切片也交给模型进行判断,如此循环直至将图片全部检测完。一旦完成后,我们按比例放大剪裁的区域,再以新的尺寸对图片进行剪裁,将新剪裁的切片按比例缩小至模型所采纳的尺寸,交给模型进行判断,如此循环。
滑动窗口技术也被用于文字识别,首先训练模型能够区分字符与非字符,然后,运用滑动窗口技术识别字符,一旦完成了字符的识别,我们将识别得出的区域进行一些扩展,然后将重叠的区域进行合并。接着我们以宽高比作为过滤条件,过滤掉高度比宽度更大的区域(认为单词的长度通常比高度要大)。下图中绿色的区域是经过这些步骤后被认为是文字的区域,而红色的区域是被忽略的。
以我们的文字识别应用为例,我们可以字体网站下载各种字体,然后利用这些不同的字体配上各种不同的随机背景图片创造出一些用于训练的实例,这让我们能够获得一个无限大的训练集。这是从零开始创造实例。
另一种方法是,利用已有的数据,然后对其进行修改,例如将已有的字符图片进行一些扭曲、旋转、模糊处理。只要我们认为实际数据有可能和经过这样处理后的数据类似,我们便可以用这样的方法来创造大量的数据。
有关获得更多数据的几种方法:
1. 人工数据合成
2. 手动收集、标记数据
3. 众包