赞
踩
现学现卖,随缘更新QwQ
主要根据b站大师兄的视频整理而成,有不懂的可以去看原视频
对于矩阵
A
A
A,
a
i
j
a_{ij}
aij表示第i个因素的重要程度是第j个因素的A[i][j]倍。
若矩阵A满足:
a
i
j
a_{ij}
aij *
a
j
k
a_{jk}
ajk =
a
i
k
a_{ik}
aik,则称A为 一致矩阵,否则称为 不一致矩阵
对于一致矩阵A,有如下 三条性质:
上述性质告诉我们,只要满足两两行/列 成倍数关系,就是一致性矩阵。
对于不一致矩阵,其最大特征根
λ
m
a
x
\lambda_{max}
λmax>n,
λ
\lambda
λ 与n相差越大,其不一致程度越大。由此,给出一致性检验指标
C
I
CI
CI =
λ
m
a
x
−
n
n
−
1
\frac{ \lambda_{max} - n} {n-1}
n−1λmax−n 其中
λ
m
a
x
\lambda_{max}
λmax表示最大特征值。CI越大,表示一致性越差,越接近0则一致性越好。
由于
C
I
CI
CI受随机因素影响,阶数n越大,该因素越显著。为了衡量
C
I
CI
CI的大小,引入
R
I
RI
RI表示随机一致性指标,并以 一致性比例
C
R
CR
CR=
C
I
R
I
\frac{CI}{RI}
RICI 作为判断依据。若
C
R
CR
CR<0.1,则认为判断矩阵的一致性可以接受,否则需要对判断矩阵进行修正,若不满足,则需构造出更多的倍数关系,直至
C
R
CR
CR < 0.1
层次分析法的最终目的就是获得不同要素的权重,以便于后续进行加权平均。具体地,先将每一列进行 归一化,也即将
a
i
j
a_{ij}
aij替换为
a
i
j
∑
i
=
1
n
a
i
j
\frac{ a_{ij} }{\sum_{i=1}^{n}a_{ij}}
∑i=1naijaij;
然后,对于非一致矩阵,将
W
i
=
∑
j
=
1
n
a
i
j
n
W_i=\frac{\sum_{j=1}^{n}a_{ij}}{n}
Wi=n∑j=1naij作为第i个要素的权重。这种求权重的方法称为算数平均求权重。由于一致矩阵各列成比例,所以只需取第一列即可,不需要进行算术平均。
另一种求权重的方式为:将最大特征值对应的特征向量进行归一化,第i个分量的值即为
W
i
W_i
Wi。这种方法称为特征值法求权重。
这种方法较于前一种方法更加方便使用,因而在实际比赛和科研中建议使用特征值法。
层次分析法是一种主观确定权重的方式,后续还会有客观确定权重的方式——熵权法
一般的对立集合具有排中律,即“非此即彼”,而对于不满足排中律的情况,则需要引入隶属函数衡量每个元素对于不同集合的隶属度。换句话说,就是对于一个论域 U U U 构造一个函数 f : U → [ 0 , 1 ] f:U \rightarrow [0,1] f:U→[0,1],以评判 U U U中每一个元素的隶属度。与层次分析法一样,这种方法也属于主观评价方法。
对于模糊集合
A
=
“年轻”,
U
=
(
0
,
120
)
A=“年轻”,U=(0,120)
A=“年轻”,U=(0,120),定义隶属函数
μ
A
\mu_A
μA:
μ
A
=
{
1
,
0
<
x
<
20
40
−
x
20
,
20
≤
x
≤
40
0
,
40
<
x
<
120
\mu_A = {1,0<x<2040−x20,20≤x≤400,40<x<120
可以看到,这个函数对U中每一个元素都给出了一个对于
A
A
A的隶属度,越大则越符合。
模糊集合的表示方法包括扎德表示法,序偶表示法,向量表示法等。
序偶表示法:
{
(
x
1
,
A
(
x
1
)
)
,
(
x
2
,
A
(
x
2
)
)
.
.
.
(
x
n
,
A
(
x
n
)
}
\{(x_1,A(x_1)),(x_2,A(x_2))...(x_n,A(x_n)\}
{(x1,A(x1)),(x2,A(x2))...(xn,A(xn)}
向量表示法:
A
=
{
A
(
x
1
)
,
A
(
x
2
)
.
.
.
A
(
x
n
)
}
A=\{A(x_1),A(x_2) ... A(x_n)\}
A={A(x1),A(x2)...A(xn)}
当U为无限集时,定义
A
=
∫
x
∈
U
μ
A
(
x
)
x
d
x
A=\displaystyle\int_{x\in U} \frac{\mu_A(x)}{x} dx
A=∫x∈UxμA(x)dx
上面例子中
A
=
“年轻”
A=“年轻”
A=“年轻”属于极小型,因为值越小隶属度应当越高。对于这类集合,其隶属函数应形如:
μ
A
=
{
1
,
x
<
a
b
−
x
b
−
a
,
a
≤
x
≤
b
0
,
x
>
b
\mu_A = {1,x<ab−xb−a,a≤x≤b0,x>b
相应地,对于极大型 ,其形式为:
μ
A
=
{
0
,
x
<
a
x
−
b
b
−
a
,
a
≤
x
≤
b
1
,
x
>
b
\mu_A = {0,x<ax−bb−a,a≤x≤b1,x>b
对于中间型,其左侧为极大型函数,右侧为极小型函数,不作赘述。
上面的构造方法称为梯形型,事实上还存在k次抛物型、柯西型、正态型等等,在需要时可以自行查阅。
确定隶属函数有模糊统计、F分布、三分法等,至少应该满足如下条件:
对于一级模糊综合评价,遵循如下步骤:
若将评语集更改为方案集,上述流程可以判断出哪个方案最优! 此时也可称评语集不带有评价色彩。
类似地,对于因素集中、指标过多时,可根据相关性将因素归纳成一个个小集合,从而进行模糊综合评价的嵌套,也即多级模糊综合评测。
信息熵是衡量混乱程度的量,其定义为:
H
(
X
)
=
∑
i
=
1
n
[
p
(
x
i
)
I
(
x
i
)
]
=
−
∑
i
=
1
n
[
p
(
x
i
)
l
n
(
p
(
x
i
)
)
]
H(X)=\sum_{i=1}^n[p(x_i)I(x_i)]=-\sum_{i=1}^n[p(x_i)ln(p(x_i))]
H(X)=i=1∑n[p(xi)I(xi)]=−i=1∑n[p(xi)ln(p(xi))]
其中
I
(
x
i
)
=
−
l
n
(
p
(
x
i
)
)
I(x_i)=-ln(p(x_i))
I(xi)=−ln(p(xi))表示
x
i
x_i
xi的信息量。根据公式,可以将信息熵理解为对信息量的期望值。信息熵越大,所当前状态的混乱程度最大,也即掌握的信息最少(信息的本质就是减少混乱程度,增大确定性),以该指标衡量对象的可靠性越差,信息有效性也就越小。
在应用熵权法之前,要先对数据进行正向化处理。指标大致可分为四类:极小型(越小越好)、极大型(越大越好)、中间型(越接近越好),区间型(落在区间内最好)。我们的目标是将其余三种类型转换为极大型。
这样,三类数据都可以用极大型指标的方式呈现,且均非负。
随后,为了消除量纲的影响,对每个数据进行标准化。设标准化后的矩阵为
Z
Z
Z,则
Z
Z
Z满足:
z
i
j
=
x
i
j
∑
i
=
1
n
x
i
j
2
\displaystyle z_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i=1}^n x_{ij}^2}}
zij=∑i=1nxij2
xij
对每一列再做归一化,得到的矩阵
P
P
P称为比重矩阵
该方法用于衡量某一个方案的优劣,具体思想是将每个衡量对象的指标标准化后分析其与最优解与最劣解的距离,进而得出最优解。
如果要考虑权重,则需将距离计算公式改为 ∑ i = 1 m w i ( x i − y i ) 2 \sqrt{\sum_{i=1}^m w_i(x_i-y_i)^2} ∑i=1mwi(xi−yi)2 的形式即可,权重的获取方法如上述。
灰色关联分析用于处理已知信息较少的问题,通过分析大致趋势的贴合程度得出各个影响因素的重要程度。
在这里,我们引入新的去除量纲的方法,即对每个指标中的元素除以该指标的均值。
具体操作中有一些excel的小技巧,详见 大师兄的讲解视频
数学规划是一类针对有限制的关系寻求最优解的方法。若关系及其限制均为线性,则称这类规划为线性规划。
针对这类问题,一般采取拉格朗日乘数法,由于实际应用中可以直接调用函数求解,故不作介绍。
调用MATLAB要求对输入数据进行标准化。引入线性规划的标准型:
min
f
T
x
,
s
.
t
.
{
A
⋅
x
≤
b
A
e
q
⋅
x
=
b
e
q
l
b
≤
x
≤
u
b
\min f^T x,s.t. {A⋅x≤bAeq⋅x=beqlb≤x≤ub
其中
f
T
f^T
fT为系数向量
[
c
1
,
c
2
,
⋯
c
n
]
[c_1,c_2, \cdots c_n]
[c1,c2,⋯cn]
在MATLAB中,求解函数格式为:
[x,val] = linprog(f, A, b. Aeq, beq, lb, ub)
% 若某项约束不存在则在对应位置填"[]"
其中 x 为目标函数取得最小值时各个变量的取值,val 表示目标函数的最小值
由于最开始给定的数据往往不满足上述形式,所以往往需要先进行预处理。
在实际建模中,我们也常常能见到多个目标函数的情况,例如,投资问题中,我们往往希望风险尽可能低,收益尽可能高。这时,我们可以定义它们的加权平均为新的目标函数。也可以通过将其余目标化为限制条件,进而保证目标函数只有一个,比如认为只要风险小于一定程度即认为可行,将收益最大化。
整数线性规划,即部分或全部决策因素只能为整数的一类问题,在MATLAB中也有直接对应的函数,即:
[x,val] = intlinprog(f, intcon, A, b, Aeq, beq, lb, ub)
注意到,intlinprog 相较于 linprog 新增了 intcon 这一参数,用来指定哪些变量为整数,例如决策变量 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3中第一个和第三个为整数,则 intcon=[1,3]
这里引入一个特殊的整数规划模型——0-1整数规划,即变量只能取0或1。落实到函数中,只需要令上述函数中lb=0,ub=1即可。
下面给出对应例题,依次为 0-1背包问题 与 指派问题:
对于整数规划,一个常见误解是只要对线性规划所得解进行简单取整就可以了。事实上,整数线性规划虽然与一般线性规划有许多联系,但绝不能粗暴地以取整相联系。
不过,根据这个思路,我们可以在一般线性规划的最优解附近寻找整数可行解,这种方法称为 完全枚举法;也可以通过将最优解中非整数元素
x
i
x_i
xi作为对整数域的分割点,分别对
{
y
i
∈
Z
∣
y
i
≥
⌊
x
i
⌋
+
1
}
\{ y_i \in \mathbb{Z}|y_i \geq \lfloor x_i\rfloor + 1 \}
{yi∈Z∣yi≥⌊xi⌋+1} 和
{
y
i
∈
Z
∣
y
i
≤
⌊
x
i
⌋
}
\{ y_i \in \mathbb{Z}|y_i \leq \lfloor x_i\rfloor \}
{yi∈Z∣yi≤⌊xi⌋}两个集合进行讨论,直到所有领域都讨论完 或 找到整数最优解为止。这种方法称为分枝定界法。
对于 非线性规划,一些典型的处理方法包括 蒙特卡洛模拟,即用大量随机试验得出最终结果,我们将会在后续予以介绍。
这道题可以采用0-1整数规划的思维,对应的方程组·为:
{
max
y
=
∑
i
=
1
10
c
i
x
i
∑
i
=
1
10
w
i
x
i
≤
30
x
i
∈
{
0
,
1
}
,
i
=
1
,
2
,
⋯
10
\left \{ maxy=10∑i=1cixi10∑i=1wixi≤30xi∈{0,1},i=1,2,⋯10
该题也是动态规划的经典例题,可以思考如何设计状态转移方程。
若存在某些限制 或 目标函数 不满足线性形式,即并非所有因素的幂次均为1,则称这类问题为非线性规划。在MATLAB中,同样有一个求解函数—— fmincon。
[x,val]=fmincon(@f, x0, A, b, Aeq, beq, lb, ub, @nonlcun, option)
对于新引入的变量:
虽然该算法只能求出局部最优解,但是如果设立多个初始值,则可能得到全局最优解(类似于蒙特卡洛的思想)。具体实现参看下图(对不起我太懒了)
关于这部分内容,由于信息竞赛出身,就不赘述了。这里列出一条大纲,可以根据大纲配合网络资料学习 (以后有时间再回来填坑)
在MATLAB中,已经有了对应的求解函数——shortestpath
[P, d] = shortestpath (G, start, end, ['method', algorithm])
碎碎念:学信息竞赛的时候就被这种算法的魅力折服了,因为它真的好神奇,但也是真的难……
求解算法的实现就是简单的模板,难就难在如何判断某个问题能否划归为网络流问题,
关于这部分的算法原理以及C++实现,参看我之前写的一篇文章,包含最大流、最小割与费用流。
在MATLAB中,求解最大流的函数为 graphmax
[Maxflow, FlowMatrix, Cut] = graphmaxflow(matrix, vs, vt)
对于费用流,不断地在残量网络上进行最短路算法即可。
微分方程与其说是一个模块,不如说是一种思想,一类问题。面对变化趋势与函数值关联的问题时,我们往往需要建立微分方程来进行刻画,例如:传染病模型,弹簧振动方程等等。
(后面有机会再填坑吧)
插值与拟合都是分析数据大致分布的方式,数据少而精确,往往用插值;数据多而低精度,往往用拟合。
插值与拟合在MATLAB中都有相应的算法,需要根据具体需要选择合适的拟合方式。
(后面有机会再回来填坑)
时间序列,简而言之,就是按时间顺序排列的数据。这里探讨的就是如何根据时间序列对未来进行预测
根据时间对数据的影响,可分为以下几类:
我们常见的数据往往是这四类数据以 加法 或 乘法 的方式结合起来,例如:若“羽绒服销量”呈现同比增长的趋势,则应将长期趋势变动程度 与 季节变动程度 相乘。
某一时刻的数据受最近的数据影响程度较大,而受相对久远的数据影响较小。根据这一思想,要想构建函数进行分析预测,需要引入与时间有关的权值函数
f
(
t
)
f(t)
f(t)。
长期趋势变动类型中,
f
(
t
)
f(t)
f(t)需要对 t 单调递增。最简单的思路是取 待预测时间点的前n项 取平均,其余项不做考虑,该方法称为 移动平均法(MA),此时
f
n
(
t
)
=
{
1
n
,
t
0
−
t
≤
n
0
,
t
0
−
t
>
n
f_n(t) = {1n,t0−t≤n0,t0−t>n
同样地,可以对移动平均法得到的数据进行二次或更多次移动平均。
这种方式显然是十分粗暴的。一般来说,
f
(
t
)
f(t)
f(t)是随t增大而平滑上升的。于是,我们构建这样一个递推式:
x
^
t
+
1
=
α
x
t
+
α
(
1
−
α
)
x
^
t
\hat x_{t+1} = \alpha x_t + \alpha (1 - \alpha)\hat x_t
x^t+1=αxt+α(1−α)x^t
这种方法称为简单指数平滑法, α \alpha α被称为平滑系数。这种方法无法分析具有趋势的情况,只是单纯地调整了权重。
在此基础上,我们引入霍特线性趋势模型,其具体方程组如下:
{
l
t
=
α
x
t
+
(
1
−
α
)
(
l
t
−
1
+
b
t
−
1
)
(水平平滑方程)
b
t
=
β
(
l
t
−
l
t
−
1
)
+
(
1
−
β
)
b
t
−
1
(趋势平滑方程)
x
^
t
+
h
=
l
t
+
h
b
t
(预测方程)
\left\{ lt=αxt+(1−α)(lt−1+bt−1)(水平平滑方程)bt=β(lt−lt−1)+(1−β)bt−1(趋势平滑方程)ˆxt+h=lt+hbt(预测方程)
我们已经能够看到,这里在继承简单平滑法(水平平滑)的基础上,又引入了对未来趋势的分析(趋势平滑),平滑系数则起到了平衡“惯性”(旧有预测)与“变化”(新增信息)的作用。
然而,这个模型依旧是不够理想的,且往往会出现预测过度的情况,所以后人又增加了“阻尼系数”的概念,用以抑制未来某一时刻的趋势,这一模型称为阻尼趋势模型。
{
l
t
=
α
x
t
+
(
1
−
α
)
(
l
t
−
1
+
ϕ
b
t
−
1
)
(水平平滑方程)
b
t
=
β
(
l
t
−
l
t
−
1
)
+
(
1
−
β
)
ϕ
b
t
−
1
(趋势平滑方程)
x
^
t
+
h
=
l
t
+
(
ϕ
+
ϕ
2
+
⋯
+
ϕ
h
)
b
t
(预测方程)
\left\{ lt=αxt+(1−α)(lt−1+ϕbt−1)(水平平滑方程)bt=β(lt−lt−1)+(1−β)ϕbt−1(趋势平滑方程)ˆxt+h=lt+(ϕ+ϕ2+⋯+ϕh)bt(预测方程)
容易发现,当阻尼系数为1时,该模型退化为霍特线性模型。
季节性的预测不同于上个模型的环比推导,更注重同期的比较。
{
l
t
=
α
(
x
t
−
s
t
−
m
)
+
(
1
−
α
)
l
t
−
1
,
(水平平滑方程)
s
t
=
γ
(
x
t
−
l
t
−
1
)
+
(
1
−
γ
)
s
t
−
m
,
(季节平滑方程)
x
^
t
+
h
=
l
t
+
s
t
+
h
−
m
(
k
+
1
)
,
k
=
⌊
h
−
1
m
⌋
,
(预测方程)
{lt=α(xt−st−m)+(1−α)lt−1,(水平平滑方程)st=γ(xt−lt−1)+(1−γ)st−m,(季节平滑方程)ˆxt+h=lt+st+h−m(k+1),k=⌊h−1m⌋,(预测方程)
与上一个模型复合起来,得到的模型可以更好地刻画增长趋势。
霍特-温特季节性加法模型,应用于较为稳定的、有季节性特征的情况
{
l
t
=
α
(
x
t
−
s
t
−
m
)
+
(
1
−
α
)
(
l
t
−
1
+
b
t
−
1
)
,
(水平平滑方程)
b
t
=
β
(
l
t
−
l
t
−
1
)
+
(
1
−
β
)
b
t
−
1
,
(趋势平滑方程)
s
t
=
γ
(
x
t
−
l
t
−
1
−
b
t
−
1
)
+
(
1
−
γ
)
s
t
−
m
,
(季节平滑方程)
x
^
t
+
h
=
(
l
t
+
h
b
t
)
s
t
+
h
−
m
(
k
+
1
)
,
k
=
⌊
h
−
1
m
⌋
,
(预测方程)
{lt=α(xt−st−m)+(1−α)(lt−1+bt−1),(水平平滑方程)bt=β(lt−lt−1)+(1−β)bt−1,(趋势平滑方程)st=γ(xt−lt−1−bt−1)+(1−γ)st−m,(季节平滑方程)ˆxt+h=(lt+hbt)st+h−m(k+1),k=⌊h−1m⌋,(预测方程)
霍特-温特季节性阻尼趋势模型,应用于稳定性不太强的情况。
{
l
t
=
α
x
t
s
t
−
m
+
(
1
−
α
)
(
l
t
−
1
+
ϕ
b
t
−
1
)
,
(水平平滑方程)
b
t
=
β
(
l
t
−
l
t
−
1
)
+
(
1
−
β
)
ϕ
b
t
−
1
,
(趋势平滑方程)
s
t
=
γ
x
t
l
t
−
1
+
ϕ
b
t
−
1
+
(
1
−
γ
)
s
t
−
m
,
(季节平滑方程)
x
^
t
+
h
=
(
l
t
+
(
ϕ
+
ϕ
2
+
⋯
+
ϕ
h
)
b
t
)
s
t
+
h
−
m
(
k
+
1
)
,
k
=
⌊
h
−
1
m
⌋
,
(预测方程)
{lt=αxtst−m+(1−α)(lt−1+ϕbt−1),(水平平滑方程)bt=β(lt−lt−1)+(1−β)ϕbt−1,(趋势平滑方程)st=γxtlt−1+ϕbt−1+(1−γ)st−m,(季节平滑方程)ˆxt+h=(lt+(ϕ+ϕ2+⋯+ϕh)bt)st+h−m(k+1),k=⌊h−1m⌋,(预测方程)
平稳性指性质与观测时间无关的序列,因此,具有趋势或季节性的时间序列不是平稳的。值得注意的是,仅具有周期性行为的时间序列是平稳的,因为周期长度不固定,我们预先不知道周期的波峰或波谷在哪。
若时间序列
{
x
t
}
\{x_t \}
{xt}满足以下三个条件:
(1)
E
(
x
t
)
=
E
(
x
t
−
s
)
=
u
E(x_t)=E(x_{t-s})=u
E(xt)=E(xt−s)=u(均值为固定常数)
(2)
V
a
r
(
x
t
)
=
V
a
r
(
x
t
−
s
=
σ
2
Var(x_t) = Var(x_{t-s}=\sigma ^2
Var(xt)=Var(xt−s=σ2(方差存在且为常数)
(3)
C
o
v
(
x
t
,
x
t
−
s
)
=
γ
s
Cov(x_t,x_{t-s})=\gamma _s
Cov(xt,xt−s)=γs(协方差只和间隔s有关,与t无关)
则称
x
t
{x_t}
xt为 协方差稳定 。
要判断序列是否平稳,我们一般通过检查自相关系数ACF,定义:
ρ
s
=
c
o
v
(
x
1
,
x
t
−
s
)
V
a
r
(
x
t
)
V
a
r
(
x
t
−
s
)
=
γ
s
γ
0
,
其中
γ
0
=
C
o
v
(
x
1
,
x
t
)
=
V
a
r
(
x
t
)
\rho _s = \frac{cov(x_1,x_{t-s})}{\sqrt{Var(x_t)} \sqrt{Var(x_{t-s})}}=\frac{\gamma _s}{\gamma _0},其中\gamma _0 = Cov(x_1,x_t) = Var(x_t)
ρs=Var(xt)
Var(xt−s)
cov(x1,xt−s)=γ0γs,其中γ0=Cov(x1,xt)=Var(xt)
这个量可以用来衡量间隔s的一对变量的相关系数。然而,由于某一个变量可能受其前面多个元素影响,对于
x
t
=
ϕ
s
1
x
t
−
1
+
⋯
ϕ
s
s
x
t
−
s
+
e
t
x_t = \phi _{s1}x_{t-1} + \cdots \phi _{ss}x_{t-s} + e_t
xt=ϕs1xt−1+⋯ϕssxt−s+et,其中\phi _{ss}就是我们关注的偏自相关系数PACF。
有一个旅行商需要拜访每一个小镇后再回到家里,小镇之间两两可达且需要一定路费,该如何规划路线才能在总花费最少呢?
将这个问题转化为图论问题,即在一张带权无向图中,遍历所有点后返回的最小代价。
一个简单的贪心思路是:先随便找一个圈,再思考如何对这个圈进行改良。对于初始圈,只需要给出这个点的排列就可以了,用
w
(
i
,
j
)
w(i,j)
w(i,j)指代边权。
具体地,对于排列
P
P
P,若存在
i
,
j
i,j
i,j 满足:
w
(
i
,
i
+
1
)
+
w
(
j
,
j
+
1
)
<
w
(
i
,
j
)
+
w
(
i
+
1
,
j
+
1
)
w(i,i+1)+w(j,j+1)<w(i,j)+w(i+1,j+1)
w(i,i+1)+w(j,j+1)<w(i,j)+w(i+1,j+1) 则断开
(
i
,
i
+
1
)
(i,i+1)
(i,i+1) 与
(
j
,
j
+
1
)
(j,j+1)
(j,j+1),连接
(
i
,
j
)
(i,j)
(i,j) 与
(
i
+
1
,
j
)
(i+1,j)
(i+1,j),重新构筑起一个圈。体现在排列
P
P
P上,即将
p
i
+
1
,
p
i
+
2
,
⋯
p
j
p_{i+1},p_{i+2}, \cdots p_j
pi+1,pi+2,⋯pj 翻转(或称颠倒顺序),形成新的排列
P
′
P'
P′。这种算法称为改良圈算法。在实际应用中,为了增大正确性,往往需要设立多个初始圈执行算法。
当然,例子中的旅行商若增大到多个,那么模型又会有新的变化,这个我们日后再讨论。
聚类分析,即将数据进行分类,“离得近”的认为是一组,“离得远”的集合彼此分开。这里定义“远近”所需的“距离”往往需要根据我们自己的定义。
将数据视作一个个向量,再对向量定义各种各样的“距离”。下面列举一些常见距离:
这里再引入两个概念。第一个为 (线性)相关系数
r
=
ρ
(
X
i
,
X
j
)
=
∑
k
=
1
n
(
x
k
i
−
x
ˉ
i
)
(
x
k
j
−
x
ˉ
j
)
∑
k
=
1
n
(
x
k
i
−
x
ˉ
i
)
2
∑
k
=
1
n
(
x
k
j
−
x
ˉ
j
)
2
\displaystyle r = \rho(X_i,X_j) = \frac{\sum_{k=1}^n(x_{ki} - \bar x_i)(x_{kj} - \bar x_j)}{\sqrt {\sum_{k=1}^{n}(x_{ki} - \bar x_i)^2}{\sqrt{\sum_{k=1}^{n}(x_{kj}-\bar x_j)^2}}}
r=ρ(Xi,Xj)=∑k=1n(xki−xˉi)2
∑k=1n(xkj−xˉj)2
∑k=1n(xki−xˉi)(xkj−xˉj)
可以看到,分子上为协方差
c
o
v
(
X
i
,
X
j
)
cov(X_i,X_j)
cov(Xi,Xj),也即两个平移后向量的内积;分母上为两个向量各自标准差相乘
σ
(
X
i
)
⋅
σ
(
X
j
)
\sigma(X_i) \cdot \sigma(X_j)
σ(Xi)⋅σ(Xj),也即两个平移后的向量对应模长相乘。由此也容易得知,
r
∈
[
−
1
,
1
]
r \in [-1,1]
r∈[−1,1]
r>0,对应正相关;r<0,对应负相关;r=0,认为不具备线性相关性。
注意:相关系数仅用于判断线性相关程度,不能说明两个向量不具备其他类型的相关性
第二个概念为夹角余弦,即未经平移后的向量直接求夹角余弦:
c
o
s
⟨
X
i
,
X
j
⟩
=
∑
k
=
1
n
(
x
k
i
−
x
ˉ
i
)
(
x
k
j
−
x
ˉ
j
)
∑
k
=
1
n
x
k
i
2
∑
k
=
1
n
x
k
j
2
\displaystyle cos\langle X_i,X_j \rangle = \frac{\sum_{k=1}^n(x_{ki} - \bar x_i)(x_{kj} - \bar x_j)}{\sqrt {\sum_{k=1}^{n} x_{ki}^2}{\sqrt{\sum_{k=1}^{n} x_{kj}^2}}}
cos⟨Xi,Xj⟩=∑k=1nxki2
∑k=1nxkj2
∑k=1n(xki−xˉi)(xkj−xˉj)
在进行聚类后,我们还需要分析两个类之间的相关性,所以还需要对两个类(设为 G p G_p Gp, G q G_q Gq)之间的距离 D ( G p , G q ) D(G_p,G_q) D(Gp,Gq)进行定义。
在实际算法中,我们可以认为孤点看作类。
该算法遵循一个简单的思路:每次取一对距离最近的类,将这两个类合并,重复上述过程直至最后仅剩一类。
我们可以通过设置迭代次数改变最终类簇数目,设置迭代次数为
k
k
k,则最终剩余
n
−
k
n-k
n−k 个类簇。
该算法流程为:
注意到该算法初值的设定直接影响最终结果,而这种预设又与数据集本身无关,于是对于初值设定做如下改进:
该算法根据密度进行聚类,定义核心点为半径E范围内数据点个数不小于规定值M的点。具体流程为:
在这个过程中,E与M的取值直接决定了聚类效果
神经网络,哇,一听就非常的高大上(bushi)
实际上,算法领域的神经网络算法就是模拟生物学上的神经网络构建出的模型,只要了解了其中本质就会发现,这个算法的难度比想象中要小很多。
下面各个量的表示方法可能不够标准,大家多包容QwQ。
生物学上,神经网络最基本的单位就是神经元,单个神经元需要具备以下功能:接受信息后产生电信号,在电信号强度超过阈值时对外传播信息。从宏观来看,一条反射弧包括感受器,效应器以及中间的信息处理部分。这种描述是不够严谨的,却反映出神经网络算法的大致结构。
整体上看,神经网络分为输入层(对应感受器)、隐藏层(对应信息处理部分)、输出层(对应效应器)。不难发现,这种构造与函数不谋而合,这三层依次对应 原像、对应关系 与 像。
对于隐藏层的每一个神经元,其所接受的“电信号”为
∑
x
i
w
i
j
\sum x_i w_{ij}
∑xiwij,
x
i
x_i
xi表示某个神经元传递的信号,
w
i
j
w_{ij}
wij表示从信号来源 i 到本神经元 j 之间路径上的权值。
除去接收的信息,阈值(或称偏置,用
θ
\theta
θ 表示)与处理传出信号的方式仅与每个神经元本身有关。这里引入激活函数的概念,
y
i
=
f
(
∑
x
i
w
i
j
−
θ
)
y_i = f (\sum x_i w_{ij} - \theta)
yi=f(∑xiwij−θ)即为输出信号。常用的激活函数为两种,第一种为S型函数:
f
(
x
)
=
1
1
+
e
−
α
x
f(x)=\frac{1}{ 1+e^{-\alpha x} }
f(x)=1+e−αx1
取值范围为
(
0
,
1
)
(0,1)
(0,1);
第二种为双极S型函数:
f
(
x
)
=
2
1
+
e
−
α
x
−
1
f(x)=\frac{2}{1+e^{-\alpha x} } - 1
f(x)=1+e−αx2−1
取值范围为
(
−
1
,
1
)
(-1,1)
(−1,1)。
这里附图:
(P.S. 不一定对,有待商榷,参考着看)
对原有网络进行优化的过程即为学习,相应地,将已经成型的网络用于处理数据即为工作。对于学习过程,按照是否提供训练集分为 监督学习 与 无监督学习,BP神经网络属于前者,通过预测值与实际值对照后的反馈来调节。
具体地,定义误差函数:
e
=
1
2
∑
i
=
1
q
(
y
i
−
z
i
)
2
=
1
2
(
Y
−
Z
)
T
(
Y
−
Z
)
,
Y
=
[
y
1
,
y
2
,
⋯
y
q
]
T
e=\frac{1}{2}\sum_{i=1}^q (y_i - z_i)^2=\frac{1}{2}(Y-Z)^T (Y - Z),Y=[y_1,y_2, \cdots y_q]^T
e=21i=1∑q(yi−zi)2=21(Y−Z)T(Y−Z),Y=[y1,y2,⋯yq]T
这里用
Z
Z
Z 表示神经网络求出的结果,
Y
Y
Y表示实际结果,我们的目标就是让误差函数尽可能地小。由于我们希望通过学习可以调整
w
i
w_i
wi ,所以我们建立误差函数与权值的直接关系:
e
=
1
2
∑
i
=
1
q
(
y
i
−
z
i
)
2
=
1
2
∑
i
=
1
q
(
f
(
∑
j
=
1
p
w
j
i
x
j
−
θ
i
)
−
z
i
)
2
e=12q∑i=1(yi−zi)2=12q∑i=1(f(p∑j=1wjixj−θi)−zi)2
对误差函数求偏导则有:
∂
e
∂
w
j
i
=
∂
e
∂
y
i
∂
y
i
∂
w
j
i
=
1
2
⋅
2
(
y
i
−
z
i
)
⋅
f
′
(
∑
j
=
1
p
w
j
i
x
j
−
θ
i
)
⋅
x
j
∂e∂wji=∂e∂yi∂yi∂wji=12⋅2(yi−zi)⋅f′(p∑j=1wjixj−θi)⋅xj
若
f
(
x
)
=
A
1
+
e
−
x
B
f(x)=\frac{A}{1+e^{ - \frac{x}{B}}}
f(x)=1+e−BxA,则
f
′
(
x
)
=
f
(
x
)
[
A
−
f
(
x
)
]
A
B
f^{'}(x)=\frac{f(x)[A-f(x)]}{AB}
f′(x)=ABf(x)[A−f(x)],代入公式,令
S
i
=
∑
j
=
1
p
w
j
i
x
j
−
θ
i
S_i = \sum_{j=1}^p w_{ji} x_j - \theta_i
Si=∑j=1pwjixj−θi则:
∂
e
∂
w
j
i
=
(
y
i
−
z
i
)
f
(
S
i
)
[
A
−
f
(
S
i
)
]
A
B
⋅
x
j
=
δ
i
x
j
\frac{\partial e}{\partial w_{ji}}=(y_i - z_i)\frac{f(S_i)[A-f(S_i)]}{AB} \cdot x_j=\delta_{i} x_j
∂wji∂e=(yi−zi)ABf(Si)[A−f(Si)]⋅xj=δixj
特殊地,对于输入层,由于没有输入信号,所以不存在激活函数及阈值;对于输出层,如果希望进行聚类分析,则采用(双极)S型函数,如果是求数值解,则令 f ( ∑ j = 1 p w j i x j − θ i ) = ∑ j = 1 p w j i x j f(\sum_{j=1}^p w_{ji} x_j - \theta_i) = \sum_{j=1}^p w_{ji} x_j f(∑j=1pwjixj−θi)=∑j=1pwjixj,也即 θ i = 0 , f ( x ) = x \theta _i =0,f(x)=x θi=0,f(x)=x。
我们的目标是让误差函数
e
e
e尽可能小,一个类似于牛顿迭代法的思路是,不断沿着当前点的切线方向移动,直至移动到某一极值点,这种方法也即梯度下降法。具体地,对于某一个权值
w
j
i
w_{ji}
wji,有:
w
j
i
=
w
j
i
−
η
∂
e
∂
w
j
i
+
α
Δ
w
j
i
w_{ji}=w_{ji} - \eta \frac{\partial e}{\partial w_{ji}} +\alpha \Delta w_{ji}
wji=wji−η∂wji∂e+αΔwji
这样每个权值就完成里其对应的修改。
讨论完权值后,对阈值
θ
\theta
θ的调整相对简单
∂
e
∂
θ
i
=
∂
e
∂
y
i
∂
y
i
∂
θ
i
=
(
y
i
−
z
i
)
⋅
(
−
f
′
(
S
i
)
)
=
−
δ
i
∂e∂θi=∂e∂yi∂yi∂θi=(yi−zi)⋅(−f′(Si))=−δi
相应地,有:
θ
i
=
θ
i
−
η
∂
e
∂
θ
i
+
α
Δ
θ
i
\theta _i = \theta_i - \eta \frac{\partial e}{\partial \theta_i} + \alpha \Delta \theta_i
θi=θi−η∂θi∂e+αΔθi
各参数意义同上。
学习流程中,对于给定的一组数据:
初始化权值与阈值,阈值范围为 [ − 1 , 1 ] [-1,1] [−1,1]内随机数,权重取0附近的随机数即可;
从输入层开始,逐层计算各个节点的输入与输出;
根据实际值与预测值计算误差函数值 e e e,若 e e e足够小则结束迭代;
若误差较大,则从输出层开始反向更新权值与阈值。对于第k层与第k+1层之间的权值,
∂
e
∂
w
i
j
=
∂
e
∂
x
j
(
k
+
1
)
∂
x
j
(
k
+
1
)
∂
w
i
j
\frac{\partial e}{\partial w_{ij}}= \frac{\partial e}{\partial x_{j}(k+1)} \frac{\partial x_{j}(k+1)}{\partial w_{ij}}
∂wij∂e=∂xj(k+1)∂e∂wij∂xj(k+1),其中
∂
x
j
(
k
+
1
)
∂
w
i
j
=
δ
j
(
k
+
1
)
\frac{\partial x_j (k+1)}{\partial w_{ij}}=\delta _j(k+1)
∂wij∂xj(k+1)=δj(k+1), 而对于
∂
e
∂
x
j
(
k
+
1
)
=
∂
e
∂
\frac{\partial e}{\partial x_j (k+1)}=\frac{\partial e}{\partial }
∂xj(k+1)∂e=∂∂e,考虑矩阵偏导
∂
e
∂
X
k
+
1
=
∂
e
∂
X
k
+
2
∂
f
(
W
⋅
X
k
+
2
−
Θ
k
+
1
)
∂
X
k
+
1
\frac{\partial e}{\partial X_{k+1}}=\frac{\partial e}{\partial X_{k+2}} \frac{\partial f(W \cdot X_{k+2}-\Theta _{k+1})}{\partial X_{k+1}}
∂Xk+1∂e=∂Xk+2∂e∂Xk+1∂f(W⋅Xk+2−Θk+1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。