题目描述
问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
输入:
4个1-10的数字。[数字允许重复,但每个数字仅允许使用一次,测试用例保证无异常数字]
输出:
true or false
输入描述:
输入4个int整数
输出描述:
返回能否得到24点,能输出true,不能输出false
示例1
输入
7 2 1 10
输出
true
解答
def p24(a): #返回条件 if len(a)== 1: if sum(a)== 24: return 1 else: return 0 #递归 for i in range(0,len(a)): for j in range(i+1,len(a)): p,q = a[i],a[j] for k in range(4): b = a[::] del b[j] del b[i] c = b[::] if k == 0: b.append(p+q) elif k == 1: b.append(p-q) c.append(q-p) elif k == 2: b.append(p*q) else: if q == 0: continue b.append(p/q) if p == 0: continue c.append(q/p) if p24(b) == 1 or p24(c)== 1: return 1 return 0while True: try: a = list(map(int,input().split(' '))) if p24(a)==1: print('true') else: print('false') except: break
]]>文章来源:2020-AAAI
文章主旨:本文利用LPP保留原始空间的局部信息来学习投影子空间,每一次投影后采用NCP与SP结合的SPL方法对目标域样本计算软标签,并以软标签为基准在下一次迭代时选择性地添加目标域样本到特征矩阵中。通过指定次数的迭代,实现无监督的领域适应。
论文的方法框架如图所示:
利用PCA对原始特征矩阵$X\in \mathbb{R}^{m\times n}$进行降维。由于PCA的降维是线性的,所以对降维后的$\tilde{X}$每一列向量实行$L_2$归一化,即$\tilde{x} \leftarrow \tilde{x}/ \Vert \tilde{x} \Vert_2$。
应用Supervised LPP学习一个保持原始空间局部结构的投影子空间:
其中$M_{ij}$是根据标签和伪标签生成的相似矩阵。当$y_i=y_j$时,$M_{ij}$值为1;否则其值为0。
在原LPP中有一段:“度矩阵$D$提供了一个对数据点的天然测度,即$D_{ii}$的值越大,那么对应的点$P^T\tilde{x}_i$就越重要”。这段话需要这样来理解,我们知道$D_{ii} = \sum_{j}M_{ij}$。其值越大说明它与其他点的关联越密切,也就越重要。为了凸显这个重要性,LPP施加了一个对$P$的列向量$p$约束$p^T\tilde{X}D\tilde{X}^Tp = 1$,其转化为矩阵形式即为:
然后考虑对投影矩阵$P$中的极大值添加正则化项:
那么结合(1)(2)(3)式,我们得到:
其中$L=D-M$。进一步,(4)式可化简为:
通过上式(5)求解$P$需要运用广义特征值分解:$Ap=\lambda B p$,其中A为n阶实对称矩阵,B为n阶实对称正定矩阵,$p_0,\dotsb,p_{m-1}$为P的列向量。在这里与(5)式对应的广义特征值分解为:
最后把按照对应特征值从大到小的顺序将特征向量$p$排列成$P$,这里所选择维度也就是所学习的子空间的维度。
为目标域的样本打上的伪标签一般采用软标签的形式,因为错误的标签有时会导致模型在优化时
被错误引导。
下文简单比较了NCP、SP和本文提出的SPL方法。
经过投影后,源域和目标域样本在子空间中的表示为:$z^s =P^T\tilde{x}^s$,$z^t =P^T\tilde{x}^t$。
然后对数据进行中心化:$z\leftarrow z -\bar{z}$,其中$\bar{z}$表示均值。
接着再次利用$L_2$正则化来提高不同类之间的分离性:$z\leftarrow z/\Vert z \Vert_2$。
之后对源域的每个类$y \in \mathcal{Y}$,以求均值的方式求出其原型的位置:
其中$\delta(y,y_i)=1$当且仅当$y=y_i$,否则为0。然后对类原型$\bar{z}_{y}^s$也实施一次$L_2$正则化。
最后通过计算高斯核函数作为条件概率,为目标域样本打上伪标签:
其中$\vert \mathcal{Y} \vert$表示类的个数。显然这里的伪标签是以软标签的形式存在的。
NCP只考虑了源域样本的信息(以源域样本中心为类的原型),而没有利用目标域样本的内蕴结构。于是SP方法考虑对投影后的目标域样本$z^t$使用K-means来分离出$\vert \mathcal{Y} \vert$个类,其中初始化的中心点由(7)式来计算得出。之后利用最终得到的中心点$\bar{z}^t$与投影后的源域样本的均值点$\bar{z}^s$依次进行最近距离匹配,从而确定每个中心点$\bar{z}^t_y$的类别。最后通过计算条件概率给目标域样本打上软标签:
可以看到NCP和SP分别以源域信息和目标域信息为基准来计算条件概率。于是SPL主张简单结合二者:
最终,$x^t$的伪标签被预测为:
此外,在学习投影矩阵的时候本文运用了一个技巧,即逐步添加目标域样本到特征矩阵$X$中。给定最大迭代次数$T$,第$k$次迭代时$X$中包含$kn_t/T$个目标域样本。为了避免某高概率类选择的样本太多,对每个伪标签$c\in \mathcal{Y}$样本按照最大概率排序选择前$kn^c_t/T$个。
算法流程如下图所示:
该模型实验效果比较显著,甚至超过了TADA、MEDA、Symnet等深度模型。
此外,作者进行了Ablation Study,即对pseudo-labeling (PL),sample selection (S) for pseudo-labeling,nearest class prototype (NCP) 和 structured prediction (SP)这四个部分进行不同的组合。最后得出四个部分都使用的时候性能是最好的。
5.1~8.7日,笔者在耕耘学术生涯中的第一篇论文,所以暂时搁置了博客。现在,盆友们,我胡汉三又回来惹!
此役历时三月有余。期间,由于实验结果达不到预期效果,于是笔者修改了模型,最后在六月下旬才做完实验。而后又马不停蹄地在参考文献中摸爬滚打,定型论文主线和框架。目前,论文的初稿已经写好了。接下来有两周的暑假时间,笔者准备回家好好休整,麻辣小龙虾等我很久了hiahiahia~🐱🏍
]]>如果后续把论文挂在arXiv,代码挂在GitHub,笔者将会在此篇博文中添加相关链接。
]]>淡墨青衫,躬植荆棘。
心囿象牙,身陷囹圄。
毋宁刺猝以醒迷痴,
不信宿命,仍抱愿景。
尝求思愆而量得失,
既怀逸兴,何惧天青。
隔世恍恍,明月悠悠,
旦辰只道,五载情愁。
离人,走马。
归客,行舟。
乘风路,沐雨途。
何处相逢,知音如故。
望尽长安花,
饮罢珠江水,
梦回洞庭湖。
To be continue
文章来源:2011-ICCV
文章主旨:
由于图拉普拉斯无法直接得到好的聚类结构,后续需要利用$K$-means来进行聚类。然而$K$-means聚类容易局部收敛,且得到非唯一的聚类结果。
对于半监督学习来说,图拉普拉斯一般使用的都是采用的二次型的图嵌入(TODO),然而这种方式对噪声和异常值敏感。
作者提出一种$\ell_1$范数约束的谱聚类框架,且扩展了一个半监督学习模型,并证明了其收敛性。
对于$Q = \left[q_{1}, q_{2}, \cdots, q_{c}\right] \in \mathbb{R}^{n \times c}$,$q_{k} \in \mathbb{R}^{n \times 1}$为$Q$的第$k$列。
Graph Ratio Cut:
Graph Normalized Cut:
详情可参见谱聚类(spectral clustering)原理总结一文。
将$(2)$式写为:
$Q$的理想解就是当$x_i,x_j$属于同一类时,使得$q^i = q^j$。也就是说$Q$的许多行都是相等的,这样就有了很强的聚类结构。那么我们想要很多对$(i,j)$有$\left|q^{i}-q^{j}\right|_{2}=0$,那么用$\ell_1$范数来解决这个问题也是等价的:
设一个$n^2$维向量$p$,其$((i-1)*n+j)$个元素为$W_{i j}\left|q^{i}-q^{j}\right|_{2}$。那么我们将$(4)$式写为:
这样我们可以直观地知道$p$的元素会由于$\ell_1$范数的约束而变得稀疏,也就为$Q$提供了一个理想的聚类结果。
$(4)$式的拉格朗格日函数为:
设拉普拉斯矩阵$\widetilde{L} = \widetilde{D} -\widetilde{W}$,$\widetilde{D}$为第$i$个元素为$\sum_j\widetilde{W}_{ij}$的对角阵,$\widetilde{W}$为:
那么$\mathcal{L}(Q)$对$Q$的偏导为零时,有:
也就是说解$Q$为$D^{-1}\widetilde{L}$的特征值。注意到$D^{-1}\widetilde{L}$又依赖于$Q$,于是可以通过迭代来得到$Q$的局部最优解。
引理1
对任意非零向量$q$,$q_t \in \mathcal{R}^c$,有:
我们需要利用引理1来证明算法可以收敛。
定理1
算法1会在每次迭代中单调地降低问题$(4)$的目标,并接近于问题的局部最优。
证明:
根据算法1的第二步,可知:
又$\left(\widetilde{W}_{t}\right)_{i j}=\frac{W_{i j}}{2\left|q_{t}^{i}-q_{t}^{j}\right|_{2}}$,那么:
根据引理1,可得:
结合$(11)(12)$式,可得:
因此,算法1将在每次迭代$t$中单调地降低问题$(4)$的目标,直到算法收敛。当达到收敛时,$(13)$式等号成立,则$Q_t$和$\widetilde{L}_t$将满足$(8)$式,也就是问题$(4)$的$\text{KKT}$条件。定理1得证。
设$Y=[\left(y^{1}\right)^{T},\left(y^{2}\right)^{T}, \cdots,\left(y^{n}\right)^{T}] \in \mathbb{R}^{n \times c}$为初始的标签矩阵。若$x_i$为无标签数据,则$y^i=0$。若$x_i$为$k$类,则$y^i$的第$k$个元素为1,否则为0。
传统的半监督学习需要解决的问题如下:
其中$L$为拉普拉斯矩阵,$U$为控制$x_i$初始标签$y^i$的影响程度的对角阵(相当于超参),$Q \in \mathcal{R}^{n \times c}$为需要求解的标签矩阵。
类似的$(14)$式可写为:
为了得到最优解$Q$,我们需要解决以下半监督分类问题(注意这个用的是$\ell_1$范数):
$(16)$式对$Q$求偏导为零时有:
定理1
算法2会在每次迭代中单调地降低问题$(16)$的目标,并接近于问题的局部最优。
证明:
设$f(Q)=\operatorname{Tr}(Q-Y)^{T} U(Q-Y)$,据算法2的第二步可知:
注意到$(\tilde{W}_{t})_{i j}=\frac{W_{i j}}{2\left|q_{t}^{i}-q_{t}^{j}\right|_{2}}$,则:
将$(19)$式和$(12)$式两边求和,可得:
因此,算法2在每次迭代$t$中单调地降低问题$(16)$的目标,收敛时$Q_t$和$L_t$满足$(17)$式。由于问题$(16)$是一个凸优化问题,满足式$(17)$表明$Q_t$是问题$(16)$的全局最优解。因此,算法2收敛到问题$(16)$的全局最优。定理2得证。
本文模型简单来说就是在Normalized Cut谱聚类的基础上,将$\ell_2$范数约束项的平方等价为了一个$\ell_1$范数,目的是为了构造出一个与$Q$相关的$\widetilde{W}$,从而联系了$Q$和$L$并使得二者交替得以更新。相较于固定$L$的原始Normalized Cut算法来说,$L$的更新无疑带来了算法的提升。说穿了感觉就像是一个优化的小trick造就了一篇顶会。
从直观层面谈一谈聚类算法:(TODO)
$K$-means。其一般采用欧氏距离所以只能局限于球形簇。距离度量的不确定性是算是聚类算法的通病。我们需要通过多次尝试,或者精细地分析所研究数据的特点来确定选取何种距离。$K$-means最大的问题是初始化过程对结果的影响非常大,对此有$K$-means++和二分$K$-means改进了初始化过程。而对噪点和异常值十分敏感的问题,出现了抛弃均值而转投中值怀抱的尝试($K$-mediods)。
DESCAN。
分层聚类。
谱聚类。主要的两个问题,
流形聚类。
子空间聚类。
文章来源:2010-TPAMI
文章主旨:
很多降维方法都是使用线性映射$F=X^TW$(比如PCA,LDA,LPP,SDA)。它们简单高效,但是在实际应用中预测标签$F$位于训练样本所张成的低维空间中未免太多严格。
提出一个新的框架,同时优化预测标签$F$,线性回归函数$h(X)$和回归残差$F_0$。其结合了标签适配度和流形平滑度(其实指的就是局部信息或局部一致性)有关的两项,以及一个灵活的惩罚项$\Vert F_0 \Vert^2$。
后知后觉:
本文的模型依然是线性的,保留了线性映射的简单高效的特点,同时利用残差放宽了线性约束,很好避免了过拟合。在深度学习还没有兴起时,这无疑是个很好的方法。感觉何凯明也是吸取了残差的思想才创造了Res-Net,本文的影响可见一斑。
Local and global consistency (LGC):
Gaussian fields and harmonic functions (GFHF):
其中配分系数$\lambda$用来平衡流形平滑度和标签适配。$\lambda_{\infty}$是个非常大的数。
注意到$(1)(2)$式共享一个方程:
其中$M \in \mathcal{R}^{m\times m}$代表拉普拉斯矩阵,$U \in \mathcal{R}^{m \times m}$为对角矩阵。
在LGC中,$M$表示一个归一化的拉普拉斯矩阵$\hat{L}$,$U$表示元素为$\lambda$的对角矩阵。
在GFHF中,$M$表示普通的拉普拉斯矩阵,$U$表示前n个元素和后$m-n$个元素分别为$\lambda_\infty$和$0$的对角矩阵。
Manifold Regularization (MR) 扩展了许多现有的算法。比如岭回归和SVM,使得它们可以通过加入一个基于几何的正则化项来进行半监督学习。
来简单看一下LapRLS/L,它就是将MR对岭回归进行扩展,同时计算岭回归的误差并保留流形平滑度。其表示为:
Semi-Supervised Discriminant Analysis (SDA) 的核心假设依然是流形平滑,也就是在低维空间中相近的点具有相似的特征表示。
定义$X_l = [x_1,x_2,\dots,x_n]$为有标签数据的矩阵。第$i$类的样本数为$n_i$。图相似矩阵$\tilde{S}^w,\tilde{S}^b \in \mathcal{R}^{n\times n}$,其中$\tilde{S}^w_{ij}= \delta_{y_i,y_j}/n_{y_i}$,$\tilde{S}^b_{ij}= (\frac{1}{n})-\tilde{S}^w_{ij}$。它们分别对应的拉普拉斯矩阵为$\tilde{L}_w$和$\tilde{L}_b$。
类内散度:
类间散度:
SDA:
LGC/GFHF基于标签传播和随机游走而被提出,LapRLSL/L的提出为了对岭回归的进行半监督扩展。
LGC/GFHF只能为现有的数据点找到一个合适的映射关系,而LapRLSL/L可以通过线性函数$h(x)$为新数据点提供一个映射。
命题1
当拉普拉斯矩阵$M\in \mathcal{R}^{m\times m}$满足$M\mathbf{1} = 0$与$\mathbf{1}^TM = 0^T,$LapRLSL/L是扩展到样本外的LGC/GFHF。
证明:
假设LGC/GFHF的解$F$位于由$X$张成的线性子空间中,比如$F= h(X)= X^TW + \mathbf{1}b^T$。其中$W \in \mathcal{R}^{f\times c}$为投影矩阵,$b\in \mathcal{R}^{c \times 1}$为偏置项。那么LGC/GFHF的目标函数$(3)$式可被写为:
接着添加一个正则化项$(\lambda_A)/(\lambda_I) \Vert W \Vert^2$,并设$M = L$,对角阵$U$的前$n$个元素和后$m-n$个元素分别为$(1)/(n\lambda_A)$和$0$。则$(8)$式变为:
于是$(9)$式就等于$(1)/(\lambda_I)g_M(W,b)$。命题1得证。
从命题1我们知道LapRLSL/L中的预测标签$F$也是被限制在由所有训练样本$X$所张成的空间中。尽管我们学得的线性函数可以映射新的数据点,但是$W$中的参数的个数并不依赖于样本的个数。因此,这个线性函数可能会过拟合来自非线性流形的训练样本。于是作者提出FME(Flexible Manifold Embedding)框架来解决这个问题。
如Fig.1所示,设$F = h(X) +F_0 = X^TW + \mathbf{1}b^T + F_0$,作者通过使用回归残差来放宽约束。其中$F_0 \in \mathcal{R}^{m \times c}$就是用来建模$F$与$h(X)$之间失配的回归残差。FME就是为了同时寻找最优的预测标签$F$,回归残差$F_0$,和线性回归函数$h(X)$。即:
其中$M \in \mathcal{R}^{m\times m}$为拉普拉斯矩阵,$U \in \mathcal{R}^{m \times m}$为对角阵。前人也做过一些类似工作,不过都是聚焦于二分类任务。在这里,作者扩展到多类别的降维任务,且类别的独立性可以从提取的特征中捕捉到。
与LGC、GFHF和LapRLS/L类似,$(10)$式的前两项分别表示标签适配度和流形平滑度。考虑到不同样本(比如$j \neq i$)的预测标签$F_i$和给定标签$Y_j$之间的近似是无意义的,因此设定$U$为前$n$个元素和后$m-n$个元素分别为$1$和$0$的对角阵。此外,为了保持流形结构(比如,$F$应该尽可能地在整个图中保持平滑),在半监督学习中$M$应该被设为图的拉普拉斯矩阵。用高斯核函数来计算$M = D - S$,其中$D_{ii} = \sum_{j}S_{ij}$,若$x_i$为$x_j$的$k$近邻,$S_{ij} = exp(- \Vert x_i - x_j \Vert^2/t)$;否则$S_{ij} = 0$。
$(10)$式中的后两项用来控制投影矩阵$W$和回归残差$F_0$。相较于LapRLS/L,我们不强制$F$位于训练样本$X$所张成的空间中。因此,我们的框架更灵活,同时也能更好地处理驻留在非线性流形的样本。
用$F-X^TW -\mathbf{1}b^T$替换$F_0$,那么得到:
定理1
设$U,M \in \mathcal{R}^{m\times m}$,$F,Y\in \mathcal{R}^{m\times c}$,$W\in \mathcal{R}^{f \times c}$,$b \in\mathcal{R}^{c \times 1}$。若$U$和$M$为半正定矩阵,且$\mu ,\gamma \ge 0$,则对于$F,W,b$为联合凸的。
证明:
在$g(F,W,b)$中,我们移除常数项$\operatorname{Tr}(Y^TUY)$,那么可以写为:
其中:
因此我们要证$g(F,W,b)$对$F,W,b$为联合凸的,只需要证$P$为半正定矩阵即可。
对任意向量$z = [z_1^T,z_2^T,z_3^T]\in \mathcal{R}^{(m+f+1)\times 1}$,其中$z_1 \in \mathcal{R}^{m \times 1},z_2 \in \mathcal{R}^{f\times 1},z_3$是个标量,则有:
也就是若$U,M$为半正定矩阵,且$\mu,\gamma \ge 0$,那么$\forall z,z^TPz \ge 0$。因此$P$为正定矩阵,也就是说$g(F,W,b)$是凸函数。定理1得证。
为了得到最优解,首先我们设$(11)$式对$b,W$的偏导为$0$。可得:
其中$A = \gamma(\gamma XH_cX^T + I)^{-1}XH_c,H_c = I - (1/m)\mathbf{1}\mathbf{1}^T$用来对数据进行中心化。利用$(12)$式重新表示$(11)$式中回归函数 $X^TW+\mathbf{1}b^T$为:
其中$B=H_{c} X^{T} A+(1 / m) \mathbf{1} \mathbf{1}^{T}$。代入$(11)$是,得到:
然后设$(14)$式对$F$偏导为$0$,可得:
根据$H_cH_c = H_c = H_c^T$和$\gamma\mu A^TXH_cX^TA+\mu A^TA = \gamma \mu A^TXH_c = \gamma\mu H_cX^TA$,$(15)$式中的$\mu \gamma(B-I)^{T}(B-I)+ \mu A^TA$可写为$\mu \gamma\left(A^{T} X-I\right) H_{c}\left(X^{T} A-I\right)+ \mu A^TA$。因此可得:
根据定义$X_c = XH_c$,我们可以计算预测标签$F$:
其中$N=X_{c}^{T}\left(\gamma X_{c} X_{c}^{T}+I\right)^{-1} X_{c}=X_{c}^{T} X_{c}\left(\gamma X_{c}^{T} X_{c}+I\right)^{-1}$。
综上,首先利用$(17)$式得到最优解$F$,然后根据$(12)$式得到最优解$W,b$。
通过设定$(11)$式中的矩阵$U$为$0$可以简单得到FME的无监督版本:
其中$V$被设为$H_c$,$I$为单位矩阵。
在无监督学习中,变量$F$可以看作低维表征的隐变量。我们限制$F$经过中心化操作后位于一个球面上,以避免$F=0$。同时$(18)$式是一个一般形式的等式,其可以通过使用不同的矩阵$M$和$V$来进行监督学习(TODO)。FME/U很自然地提供了一个对新数据映射方法,即$h(X) = X^TW+ \mathbf{1}b^T$,且由于增加了一个残差惩罚项($\Vert h(X) - F \Vert^2$),所以较于前人研究的“硬核”映射$F = X^TW$更显灵活性。
同样类似的优化步骤,首先设$(18)$式对于$W,b$的偏导为$0$,根据$(12)$式计算$W,b$,然后将$W,b$代入$(18)$式中,得到:
最后根据$(16)$式,可以将$(19)$式写为:
其中$N=X_{c}^{T}\left(\gamma X_{c} X_{c}^{T}+I\right)^{-1} X_{c}=X_{c}^{T} X_{c}\left(\gamma X_{c}^{T} X_{c}+I\right)^{-1}$。
综上,我们先通过$(20)$式得到最优解$F$,然后通过$(12)$式得到最优解$W,b$。
模型比较分三个部分:
示例1
LGC与GFHF为FME的两种特殊情形。
证明:
若我们设$\mu = 0$,那么FME的目标函数$(11)$式就退化成了
$(3)$式,也就是LGC和GFHF的一般形式。示例1得证。
示例2
LapRLS/L也是FME的一种特殊情形。
证明:
若我们设$(11)$式中$\mu (\lambda_A)/(\lambda_I)$且$\gamma \rightarrow \infty$,那么可得$F = X^TW+\mathbf{1}b^T$,代入$(11)$式有:
进一步设$M = L$且$U$为前$n$个元素和后$m-n$个元素分别为$(1)/(n\lambda_I)$和$0$的对角阵。那么$g(W,b)$就等于$(4)$式中的$(1)/(\lambda_I)g_M(W,b)$。示例2得证。
此前有一篇很厉害的文章提出了广义的图嵌入框架整合了一大堆降维算法(如PCA, LDA, ISOMAP, LLE, LE)。文章把各个算法给定的统计和几何性质编码为图形关系,并且每个算法都可以被看作是直接图嵌入,线性图嵌入,或其他扩展。直接图嵌入的目标函数为:
其中$V$为另一个图拉普拉斯矩阵(比如中心矩阵$H_c$),那么有$V\mathbf{1} = \mathbf{0},\mathbf{1}^TV = \mathbf{0}^T$。
然而直接的图嵌入计算得到的对于训练样本低维表征$F$并不能为新的数据点提供映射。那篇文章中也给出了解决方法,线性化,核化,向量化等。假设一个硬线性映射为$F = X^TW +\mathbf{1}b^T$,那么目标函数在线性图嵌入中表示为:
示例3
直接图嵌入和它的线性化是$FME/U$的一种特殊情形。
证明:
若我们设$\mu = 0$,那么$FME/U$的目标函数退化为$(22)$式中的直接图嵌入。
当$(18)$式中$\mu \rightarrow 0,\mu \gamma \rightarrow \infty$时,有$F = X^TW +\mathbf{1}b^T$。替换$(18)$式中的的$F$后$FME/U$的目标函数退化为$(23)$式中的线性图嵌入。示例3得证。
SR的提出是为了解决投影矩阵$W$来映射新数据点的问题。分为两个步骤,首先$(18)$式已经得到最优解$F$,然后计算最优解$W,b$:
示例4
SR是$FME/U$的一种特殊情形。
证明:
当$\mu \rightarrow 0, \gamma = 1/\lambda$,那么$(18)$式会退化为$(22)$式,也就是说我们先解$F$。然后目标函数从$(18)$式转化到$(24)$式来解$W$,此时注意到SR目标函数为$W^{*}=\left(X H_{c} X^{T}+\lambda I\right)^{-1} X H_{c} F$,且与FME/U中的一致。示例4得证。
直接上图:
文章的创新点在于加入了一个回归残差作为惩罚项,并整合了多个降维算法。看这篇文章最大的收获,其一就是学会了一种利用残差来放宽约束的方法,可以避免过拟合非线性流形的训练数据。其二就是了解了各大知名的降维算法。论文有些地方的还没有读通透,需要再仔细研读一下。
对于迁移学习的研究的思考。
我们一般假设源域和源域数据采样一个高维流形之中,那么一般的做法大多是对源域和目标域数据进行本文中所描述的“硬核”线性投影($W^TX+b$),得到一个利于最终任务的子空间(当然其中需要有各种图拉普拉斯约束,MMD约束等)。也就是说我们得到的子空间其实是一个线性的空间(见Fig.1),对于投影后不在这个空间的新数据而言,约束太过严格了。那么我们能否加一个残差项来补足呢?也就是说我们最后学的映射是$F =W^TX+b+ F_0$觉得这一点很值得一试。
对于深度学习的思考。
按照作者的理论,其实普通的全连接神经网络的每一层的输出相当于对输入做了一次投影$W^TX+b$,那么为了让输出有更好的表现力,利于最终任务,我们能否在每一层中加入一个残差项呢?这个残差项跟何凯明的Res-Net不一样。我们的目的是使得输出有更好非线性表现,也就是相当于一个激活函数的作用,重要的是这个激活函数不需人为指定。至于是否会出现过拟合,梯度爆炸和梯度消失,结合BN层会产生哪些“化学反应”等问题,还需仔细琢磨一下。这也不失为一种创新的方法。
如何让文章C位出道~
首先修改/node_modules/hexo-generator-index/lib/generator.js
文件,添加置顶功能:
'use strict';var pagination = require('hexo-pagination');module.exports = function(locals){ var config = this.config; var posts = locals.posts; posts.data = posts.data.sort(function(a, b) { if(a.top && b.top) { // 两篇文章top都有定义 if(a.top == b.top) return b.date - a.date; // 若top值一样则按照文章日期降序排 else return b.top - a.top; // 否则按照top值降序排 } else if(a.top && !b.top) { // 以下是只有一篇文章top有定义,那么将有top的排在前面(这里用异或操作居然不行233) return -1; } else if(!a.top && b.top) { return 1; } else return b.date - a.date; // 都没定义按照文章日期降序排 }); var paginationDir = config.pagination_dir || 'page'; return pagination('', posts, { perPage: config.index_generator.per_page, layout: ['index', 'archive'], format: paginationDir + '/%d/', data: { __index: true } });};
然后修改/themes/indigo/layout/_partial/post.ejs
文件,给索引页面增加置顶样式:
<%- partial('post/toc', { post: post}) %><article id="<%= post.layout %>-<%= post.slug %>" class="post-article article-type-<%= post.layout %> fade" itemprop="blogPost"> <div class="post-card"> <h1 class="post-card-title"><%- post.title %></h1> <div class="post-meta"> <%- partial('post/date', {date_format: config.date_format}) %> <%- partial('post/category') %> <% if (post.top>0) { %> <span><icon class="icon icon-thumb-tack icon-pr"></icon><font color="ff4081">置顶</font></span> <% } %> <%- partial('plugins/page-visit') %> </div> <div class="post-content" id="post-content" itemprop="postContent"> <%- post.content %> </div> <%- partial('post/copyright') %> <%- partial('post/reward-btn') %> <div class="post-footer"> <%- partial('post/tag') %> <%- partial('post/share-fab') %> </div> </div> <%- partial('post/nav') %> <%- partial('post/comment') %></article><%- partial('post/reward') %>
之后修改/themes/indigo/layout/_partial/index-item.ejs
文件,给正文页面增加置顶样式:
<article id="<%= post.layout %>-<%= post.slug %>" class="article-card article-type-<%= post.layout %>" itemprop="blogPost"> <div class="post-meta"> <%- partial('post/date', {date_format: config.date_format}) %> <%- partial('post/category') %> <% if (post.top>0) { %> <span><icon class="icon icon-thumb-tack icon-pr"></icon><font color="ff4081">置顶</font></span> <% } %> </div> <%- partial('post/title', { hasLink: true }) %> <div class="post-content" id="post-content" itemprop="postContent"> <% if(theme.excerpt_render) { %> <%- post.excerpt || post.content %> <% } else { %> <%- post.excerpt ? strip_html(post.excerpt) : truncate(strip_html(post.content), { length: theme.excerpt_length }) %> <% } %> <a href="<%- url_for(post.path) %>" class="post-more waves-effect waves-button"> <%= __('post.continue_reading') %> </a> </div> <% if(post.tags && post.tags.length){ %> <div class="post-footer"> <%- partial('post/tag') %> </div> <% } %></article>
最后大功告成,只需要在.md
文件中加入top
初始化参数,比如:
title: Hexo置顶文章date: 1111-11-11 11:11:11tags: Hexocategories: Hexotop: 1
]]>
文章来源:2014-KDD
文章主旨:
吐槽与膜拜:
这篇文章的符号设定简直反人类,且还有几处小错误。但是瑕不掩瑜,论文字字珠玑,最牛批的是直接让$K$-means和谱聚类沦为了跟班小弟。当时就WC了,小脑袋瓜都怎么长的,咋这好使。传统的机器学习确实是宝刀未老,14年的文章现在来看也毫不过时(也可能是我涉猎太少)。反观现在的深度学习研究感觉处在一个病态阶段,大都是在用体力劳动的结果说话,反复修改参数,堆砌部件,结果好就是老大,丝毫不管为什么好,为什么不好,模型的可解释性如何。不得不感叹,我们离真正的人工智能时代之间确实还是道阻路且长,在让机器学会如何学习之前,只能姑且被称为人力驱动的劳动密集型AI。在此之前,传统的机器学习还是应该受到重视的,因为深度学习的诱导和和驱动的源泉还是这些传统机器学习知识。一通认知浅薄的大话,不知不觉就扯远了,总之本文绝对是值得反复读的经典没错!
更小的距离应该被分配更大的邻近概率:
其中第二项相当于正则化项,表示在不考虑数据的距离信息情况下,每个数据点$x_i$与其他点的邻近概率趋向于$\frac{1}{n}$(算术平均数≤平方平均数),以此作为一个先验的邻近分配。
进一步,将$d_{ij}^x = \Vert x_i - x_j \Vert_2^2$代入,则$(1)$式可转化为:
诱导连通分量为$c$个(即将数据聚为$c$簇)。
将$(1)$式中得到的$S\in \mathbb{R}^{n\times n}$看作图节点的相似矩阵,每个节点$i$被赋值为$f_i \in \mathbb{R}^{1\times c}$,有:
若相似矩阵$S$为非负的,那么拉普拉斯矩阵满足一个重要性质:
定理1
在拉普拉斯矩阵$L_S$中,特征根0的重数等于图的相似矩阵$S$的连通分量个数。
也就是说,我们可以通过约束$rank(L_S) = n-c$来得到很好的聚类结构。而不需要进行$K$-means或者其他离散化程序。因此,结合(1)式,得到:
对于$(4)$式的优化算法。
设$\sigma_i(L_S)$是$L_S$最小的第$i$个特征值,且因为$L_S$为半正定的,$\sigma_i(L_S)\ge 0$。则可引入一个足够大的$\lambda$,将$(4)$式转化为:
根据Ky Fan定理,我们可以得到:
将$(6)$式代入$(5)$式,有:
这样一来,问题就简单了很多。我们可以先固定$S$,那么$(7)$式变成了:
我们对$(8)$式求的$F$其实就是$L_S$最小的$c$个特征值所对应的特征向量。然后固定$F$,那么$(7)$式就变成了:
根据$(3)$式,有:
注意$d_{ij}= d^x_{ij} + \lambda d^f_{ij}$,其中$d_{ij}^x = \Vert x_i - x_j \Vert_2^2$,$d_{ij}^f = \Vert f_i - f_j \Vert_2^2$。根据$(2)$式,有:
其中$s_i$和$d_i$分别为$S$和$d_{ij}$的第$i$列向量。
综上,交替迭代$(8)$和$(11)$式更新$F$和$S$即可。
引理1
$HD^xH =-2HXX^TH$
证明:
中心矩阵定义为:
由$d^x_{ij} =\Vert x_i -x_j \Vert_2^2 = x_i^Tx_i +x_j^Tx_j -2x_i^Tx_j$,可得:
同时注意$H\mathbf{1} = \mathbf{1}^TH = 0$,则对$(13)$式左乘右乘$H$,得证。
定理2
当$\gamma \rightarrow \infty$时,$(4)式$等价于$K$-means问题。
证明:
将$(4)$式写成矩阵形式:
由于$rank(L_S) = n- c$,那么解$S$有确切的$c$个连通分量,也就是$S$经过适当变换之后可以写成块对角的形式,例如:
第$i$个连通分量$S_i \in \mathbb R^{n_i\times n_i}$,其中$n_i$为该连通分量中的数据个数。那么$(14)$式可转化为对每个连通分量$i$:
当$\gamma \rightarrow \infty$时,$(15)$式就转化为:
那么$(16)$的最优解就是$S_i$的所有元素都等于$\frac{1}{n_i}$。
因此,当$\gamma \rightarrow \infty$时,$(14)$式的最优解$S$应该是这样的:
也就是说对于每一个最优的划分$\mathcal{V}$来说,总有$\Vert S \Vert_F^2 = c$。到了这里发现$(14)$式的第二项在后续的优化过程中是个常数,$(14)$式可写为:
其中$S$为对称阵,且$\mathbf{1}^T S = \mathbf{1}^T$,再结合$(12)$式。可知:
那么根据$(19)$式,$(18)$式可写为:
定义一个标签矩阵$Y \in \mathbb{R}^{n\times c}$,其中:
结合$(20)(21)$式和引理1,可得:
终于得证了当$\gamma \rightarrow \infty$时,这就是一个实打实的$K$-means问题。当标签$Y$已知时,$S_w$其实就是线性判别分析(LDA)中的类内散度矩阵。而$K$-means就是要找到一个最优的$Y$来使得$S_w$的迹最小。
值得注意的是,尽管$\gamma \rightarrow\infty$时,算法只能用来解决$K$-means问题(对数据进行球形分区),但是当$\gamma$不是很大的时候,还是能解决任意形状的分区问题的。牛批!
当给定图的相似矩阵$S$时,谱聚类要解决的问题是:
与$(8)$式一样,最优解$F$就是由拉普拉斯矩阵$L_S$中最小的$c$个特征值所对应的特征向量组成的。
通常,在给定$S$后求得的$F$并不能直接用来聚类,因为$S$没有给出明确的连通分量个数$c$。也就是需要对$F$进行$K$-means或其他离散化过程才能得到最终的聚类结果。
但是在本文的模型中,$F$和$S$是交替优化的。当最终收敛时,$(23)$式求出来$F$,$S$同时也被求得。并且得益于$rank(L_S) = n -c$这一约束,学得的$S$有明确的连通分量个数$c$。所以$F$直接就是聚类的结果,不需要像传统的谱聚类一样再对$F$聚类。
因此,最优解$F$可以被写为:
其中$Y\in \mathbb{R}^{n \times c}$就是$(21)$式中定义的标签矩阵;$Q \in \mathbb{R}^{c \times c}$是任意的正交矩阵。意思是$rank(F) = c$,也就是说本文模型得到的$F$直接就是聚类的结果。
可以看到,传统的谱聚类只能在给定相似矩阵$S$时来求$F$,并且还需要对$F$再聚类才能得到结果。而本文算法不仅不需要给定$S$,还能生成一个自适应的$S$。厉害!
众所周知,调好超参就等于成功了一半。在本文的模型中,$\gamma$恐怕是最难缠的了,其跨度是$[0,\infty)$,想想都头疼。于是作者做了下面的工作大大减少了死于调参的脑细胞。
对于$(7)$式中的$\gamma$,可以将$(7)$式等价于$(2)$式。$(2)$式的拉格朗日函数为:
其中$\eta,\beta_i \ge 0$为拉格朗日乘子 。根据$\mathrm{KKT}$条件,最优解$s_i$可被表示为:
通常关注数据的局部性可以得到更好的效果,最好就是学的一个稀疏的$s_i$,也就是只有$x_i$的$k$个最临近的点才有机会与$x_i$相连。稀疏的相似矩阵$S$另一个好处当然是可以缓解后续的计算压力。
不失一般性地假设$d_{i1}^x,d_{i2}^x,\dots,d_{in}^x$从小到大排列。如果最优解$s_i$仅有$k$个非零元素,那么根据$(26)$式,我们知道$s_{ik}> 0$且$s_{i,k+1} = 0$。因此,可得到:
再根据$(26)$式和$s_i^T\mathbf{1} = 1$,我们有:
因此对于$(2)$式,为了得到有$k$个非零元素的最优解$s_i$,根据$(27)(28)$式我们可以将$\gamma_i$设为:
那么对于所有的$\gamma$,即$\gamma_1,\gamma_2,\dots,\gamma_n$,有:
这样对$\gamma$的调参就转化为了对邻近数$k$的调参,而$k$属于整数集且有直观的含义,效率无疑得到大幅提升。
为了解决高维数据的聚类问题,作者想找到一个最优的投影子空间,使得利用本文的模型能让数据点在其中可以得到准确的$c$个连通分量结构。
注意到总散度矩阵$S_t = X^THX$,其中$H$为$(12)$式定义的中心矩阵。假设我们要学得一个投影矩阵$W\in \mathbb{R}^{d\times m}$。首先我们需要约束子空间$W^TS_tW=I$,实际上就是保留了原空间的协方差,即保证在子空间中数据都是统计意义上不相关的(协方差矩阵其实就等于散度矩阵除以$n-1$)。其次,需要根据$(1)$式来分配近邻。所以要解决的问题可表示为:
同样的,为了诱导$c$个连通分量,我们通过$rank(L_S) =n -c$来约束$S$,于是学习投影矩阵$W$和学习聚类可以同时进行:
对于$(32)$式的优化算法。
采用$(5)(6)$式同样的trick将$(32)$式转化为:
首先固定$S$和$W$,则$F$由拉普拉斯矩阵$L_S$中$c$个最小特征值对应特征向量组成。
然后就是固定$F$,$(33)$式变为:
接着固定$S$,$(34)$式变为:
再根据$(3)$式,$(35)$式变为:
那么最优解$W$由$S_t^{-1}X^TL_SX$中最小的$m$个特征值所对应的特征向量组成。
最后固定$W$,对于$(34)$式有:
注意到$(37)$式中所有$i$都是独立的。且有$d_{ij}^{w}= d^{wx}_{ij} + \lambda d^{f}_{ij}$,其中$d_{ij}^{wx} = \Vert W^Tx_i - W^Tx_j \Vert_2^2$,$d_{ij}^f = \Vert f_i - f_j \Vert_2^2$。$(37)$式可写为向量形式:
综上,首先固定$S$和$W$更新$F$,然后固定$F$和$S$根据$(36)$式更新$W$,最后固定$F$和$W$根据$(38)$式更新$S$。
定理3
当$\lambda \rightarrow \infty$时,$(32)$式等价于LDA问题,其中标签也是需要被优化的变量。
证明:
$(32)$式写成矩阵的形式:
同样最优解$S$由于$rank(L_S) = n -c$的缘故,可以变换后得到一个分块对角阵,对每一个连通分量$i$有:
当$\lambda \rightarrow \infty$时,$(40)$式变成了:
那么对于最优解$S$,其分块$S_i$的每一个元素都等于$\frac{1}{n_i}$。
也就说当$\lambda \rightarrow \infty$时,每一个满足最优解的划分$\mathcal{V}$,都有:
最后结合$(42)$式和引理1,有:
如果标签矩阵$Y$已知,那么$(43)$式就等价于LDA问题。因此当$\lambda \rightarrow \infty$时,本文的模型可以解决标签矩阵未知的LDA问题。
当$\gamma$不是很大时,$(36)$式中的矩阵$X^TL_SX$可以被视为局部类散度矩阵。在这种情况下,模型可以看作是基于局部散度矩阵的LDA方法的无监督版本,而LDA方法是为处理多模态非高斯数据而设计的。
先说一下读这篇论文的感受。一开始拿到论文,因为不熟悉的聚类领域,认真看了INTRODUCTION。然后就开始懵逼了,这么多公式,推理向的论文简直让人头大。可能是因为看西瓜书看怕了,最怕就是前面还是1+1
,后面就变成了@#¥%
。但是一路看下来,论文推导写的意外的流畅,看得舒爽无比。看完模型后其实没有感觉有多厉害,然而没有对比就没有伤害,后面作者把自己的模型联系到$K$-means和谱聚类,让二者直接成为了模型的一种特例时,简直激动到爆炸。膜拜!
感慨万千,数学功底真的是无比重要,关键时刻旁征博引,各种定理引理张口就莱,打通了论文的任督二脉,狼人话不多,直接两开花。
关于均值不等式。
如果$x_{1},x_{2},\ldots ,x_{n}$是正数,则有$H_n \le G_n \le A_n \le Q_n$,其中:
当且仅当$x_{1}=x_{2}=\cdots =x_{n}$,等号成立。
即对这些正数:调和平均数 ≤ 几何平均数 ≤ 算术平均数 ≤ 平方平均数
关于迹的运算。对于$A_{n\times n },B_{n\times n },C_{n\times n }$有:
关于$\mathrm{KKT}$条件(详见李航《统计学习方法》附录C)。
可以利用算法到迁移学习中。比如谱聚类中,我们能否利用算法生成的自适应的$S$作为监督学习。
2019年4月3日 VALSE Webinar 中听了报告嘉宾的两篇论文:《Image Translation for Domain Adaptation and Generalization》、《Image Translation for Domain Adaptation and Generalization》。然后Panel嘉宾(龙明盛、段立新)的进行了一些讨论。
简单规划一下读论文的方向:
再也不用担心博客迷路了!
Hexo
先在本地生成静态网页文件并暂存于.deploy_git
文件夹中,然后部署时只把该文件夹push
到远程仓库的master
分支中。因此,我们可以在仓库中创建第二个分支来备份源文件。这样我们就能在利用Git
的分支管理系统来进行多终端工作了。
2019年5月30日更新:由于GitHub的公开仓库才能免费使用静态网页,为避免源码泄露使用Coding仓库。
Coding
中博客所在的仓库,新建一个分支,命名为hexo
。settings
的Branches
选项中,把默认分支设为hexo
。(因只需要对hexo
分支进行手动操作,这样同步不需要指定分支,更加方便。)git bash here
:git clone git@git.dev.tencent.com:YvanZh/YvanZh.coding.me.git
YvanZh.coding.me
文件夹中,删除.git
文件夹以外的所有文件。YvanZh.coding.me
文件夹中,除了.deploy_git
。复制过来的源文件应该有一个.gitignore
,用来忽略一些不需要的git
的文件。如果没有的话,新建一个,内容如下: .DS_Store Thumbs.db db.json *.log node_modules/ public/ .deploy*/
theme
文件夹中的.git
文件夹。git bash here
: git add . git commit -m "add branch" git push
这样就将博客源文件上传到了hexo
分支,完成了备份。
PS:注意.git
文件夹为隐藏文件夹,请务必开启隐藏文件可见。
搭建环境的过程与之前无异:
Git
,并绑定全局用户名和邮箱,配置SSH密钥。Node.js
。Hexo
: npm install hexo-cli -g
gti bash here
: git clone git@git.dev.tencent.com:YvanZh/YvanZh.coding.me.git
cd YvanZh.coding.me
,进入克隆到本地的文件夹: npm install npm install hexo-deployer-git --save hexo g -d
hexo new newpage
hexo
分支: git add . git commit -m "xxx" git push
git push
需要输入密码,那么解决办法如下:git remote set-url origin git@git.dev.tencent.com:YvanZh/YvanZh.coding.me.git
颇费,美滋滋,滚去看论文了~
]]>别问,问就惜败。
研一上学期就获悉了华为比赛的信息,笔者作为本科期间多次参加数学建模竞赛的老菜鸟,其实还是有点想法的,再加上实验室的小伙伴(C++同学)的“勾搭”,直接就上了“贼船”。
2019年3月10日至29日为练习阶段,30日9:00~17:00为初赛阶段。三只小菜鸡不停啄米,走了不少弯路,最后一周通宵了两次。最后由于时间紧张,棋差一招,很遗憾,很不甘,来年再战!
接下来说说一些关键的时间点:
下面是比赛的思路:
话不多说,直接上伪代码:
for(T){ // 对车进行标记,终止状态为0,等待状态为1,可入库状态为2。ASC表示升序。 for(EachRoad){ 1StateCarQueue_EachRoad = queue[] 0StateCarQueue_EachRoad = queue[] // 是否把终止状态的车也顺便放在一个队列里面,这样可以省去调度时遍历的时间。 AheadCar_EachChannel(1:NumberOfChannel) = 0 //对每个Channel设一个变量 for((i = LenOfRoad):1:1){ for(EachChannel_ASC){ if(Road_Record(i) != 0){ CarID = GetCarID() AheadCar_EachChannel = CarID V1 = min(Car_Speed, Road_Speed) if(AheadCar_EachChannel == 0){ S1 = GetDistanceToAcrossRoad() V2 = min(Car_Speed, NextRoad_Speed) S2 = V2 - S1 if(S2 <= 0){ S2 = 0 Car_State = 0 BehindCarState_EachChannel = 0 if(S1 < V1 && RoadID == EndRoad){ Car_State = 1 } } else{ Car_State = 1 BehindCarState_EachChannel = 1 } } else{ S1 = GetDistanceToAheadCar() GetCarChannel if(BehindCarState_EachChannel == 1 && S1 < V1){ Car_State = 1 } else{ Car_State = 0 BehindCarState_EachChannel = 0 /* 这里可能需要找出由于前面阻挡的车为终止状态,而导致无法过 路口的车。即 S2 > 0 但是被前车所阻挡。后面这些车需要封锁这 条路,然后更新一下地图,再算其最短路径。 */ } } if(Car_State == 1){ 1StateCarQueue_EachRoad = ArcossCarQueue_EachRoad.append(CarID) } else{ 0StateCarQueue_EachRoad = ArcossCarQueue_EachRoad.append(CarID) } } } } } // 对道路内终止状态即Car_State == 0 的车进行调度。 for(EachRoad){ for(EachChannel){ for(LenOfRoad:1:1){ if(Car_State == 0){ CarRun } } } } // 对路口车辆调度。ASC表示升序。 TODO:需要加入一个到达终点车的判定。 for(EachCrossRoad_ASC){ CarCanAcross = 1 while(CarCanAcross){ for(EachRoad_ASC){ for(AcrossCarQueue_EachRoad){ if(AcrossCarQueue_EachRoad == [] or CarCanAcross_EachRoad == 0){ // CarCanAcross_EachRoad = 0 break } CarID = GetCarID() if(V1 - S1 > 0 && RoadID == EndRoad){ CarOffline } if(S2 <= 0){ // CarRun // ChannelBlcok // AcrossCarQueue_EachRoad.pop() // 提取出被锁住的同channel的车,剩余队列继续进行路口调度 } Car_Direction = GetCarDirection() // 1, 2, 3 分别表示 D, L, R NextRoadID = GetNextRoadID() if(NextRoadHaveSpace == 0){ CarCanAcross_EachRoad = 0 BlockedCar_EachRoad = AcrossCarQueue_EachRoad break } if(Car_Direction == 1){ CarAcross // CarCanAcross需要从小号车道开始进入 AcrossCarQueue_EachRoad.pop() // 更新Both Roads } elseif(Car_Direction == 2){ ConflictRoad = GetTurnLeftConflictRoad() if(AcrossCarQueue_ConflictRoad_FirstCar_Dierection == 1){ break } CarAcross AcrossCarQueue_EachRoad.pop() /* (100,21,30,9,55)表示的是第100号路口,按顺时针方向道路为21 , 30, 9, 55。此时本道路车辆左转前需要检查本道路的逆时针方向第 一条道路有无直行车辆。有直行车则冲突,暂时结束对本道路的调度, 转而调度下一道路。 */ } else{ ConflictRoad1 = GetTurnRightConflictRoad1() ConflictRoad2 = GetTurnRightConflictRoad2() if(ArocssCarQueue_ConflictRoad1_FirstCar_Direction != 1 && AcrossCarQueue_ConflictRoad2_FirstCar_Direction !=2){ CarAcross AcrossCarQueue_EachRoad.pop() } /* 本道路车右转前需要先检查本道路的顺时针方向第一条道路有无直行 车辆,然后检查本道路顺时针方向第二条道路有无左转车辆。 */ } } if(sum(CarCanAcross_EachRoad) == 0){ CarCanAcross = 0 break } } } } // 对出车库的车进行调度,如果没有空位,则延迟一个单位时间出发。 for(EachCrossRoad){ if(GarageHaveCar){ GetCarID() GetStarTime() if(StartTime <= T && MaxCar < N && RoadLoad < n% ){ //若车辆达到计划出发时间,且所有道路总车辆小于N,且该道路负载程度小于n%。 //道路负载程度 = 道路车辆数/(道路长度*道路车道数) if(RoadHaveSpace){ CarOut //检索出第一条道路的起始列有无空当。有空当的话优先进入小号Channel。 } } } }}
笔者之前犯了一个严重的错误——没有分析地图数据,而这直接导致了优化算法的思路出现了问题。我们一直纠结于如何排除死锁、优化路径组合和道路负载均衡。然而真正重要的一点,也是能在简单分析地图数据后就知道的——车辆的速度问题。
就地图数据来看,车辆的计划出发时间都在100个时刻之内,而实际的出发时间需要人为设定,这正是判题器的作用之一(输出车辆的实际出发时间)。我们再来看看系统调度总时间的量级,其实是在千位的。换句话说,即使考虑最极端的情况,我们让所有车辆都在第100个时刻之后出发,也影响不了太多总时间。再看车辆的速度其实只有2,4,6,8,10,12,15,16这七种,那么我们为何不分批次把所有同速度的车来进行调度呢?这样无疑去除了慢车对快车速度限制,同时间接地减少了死锁和道路负载过大的问题。这是我们30日上午幡然醒悟,然而时间有限,确实来不及实现了。
那么解题流程应该是这样:
文章来源:2018-CVPR
Tips:
文章主旨:
笔者之前就认为VAE框架本身的局限之处在于隐变量的先验分布,为了简单方便计算一般采用伯努利分布或标准正太分布。然而这无疑限制了模型的表达能力。在本文章中通过分离隐变量$z$和类属性向量$a$,并引入一个将生成的样本$\hat{x}$映射到类属性向量$a$的多元回归器。既利用了VAE的生成能力,又增加了一个学习诱导,这样不失为一种好办法。
那么我们能不能从本质上改进VAE呢?VAE框架的根源其实说到底就是KL散度。KL散度可以度量两个概率分布的差异,但是我们甚至不能称其为距离,因为它不满足对称性。然而它的优势在于可以写成期望的形式,也就是可直接进行采样计算。$\mathrm{KL}(p(x)||q(x))$有一个比较明显的问题,就是当$q(x)$在某个区域等于0,而$p(x)$在该区域不等于0,那么KL散度就出现无穷大。这是KL散度的固有问题,我们只能想办法规避它,比如隐变量的先验分布用高斯分布而不是均匀分布。Idea is cheap,留待实践。
VAE理论框架:
数据样本$\{x_1,\dots,x_n\}$,其整体用$x$来描述,我们希望借助隐变量$z$描述$x$的分布$\tilde{p}(x)$:
其中$q(z)$是先验分布(标准正态分布),目的是希望$q(x)$能逼近$\tilde{p}(x)$。这样(理论上)我们既描述了$p~(x)$,又得到了生成模型$q(x|z)$,一举两得。
接下来就是利用KL散度进行近似。很多教程推导都是聚焦于后验分布$p(z|x)$。但事实上,直接来对$p(x,z)$进行近似是最为干脆的。具体来说,定义$p(x,z) = \tilde{p}(x)p(z|x)$,设想用一个联合概率分布$q(x,z)$来逼近$p(x,z)$,那么用KL散度来看它们的距离:
KL散度是我们的终极目标,因为我们希望两个分布越接近越好,所以KL散度越小越好。于是有:
由$\ln \frac{\tilde{p}(x)p(z|x)}{q(x,z)}=\ln \tilde{p}(x) + \ln \frac{p(z|x)}{q(x,z)}$,我们进一步对$(11)$进行简化:
其中的$\tilde{p}(x)$是根据样本$x_1,x_2,\dots,x_n$确定的关于x的先验分布,尽管我们不一定能准确写出它的形式,但它是确定的、存在的,因此这一项只是一个常数,所以可以写出:
最后为了得到生成模型,所以我们把$q(x,z)$写成$q(x|z)q(z)$,于是就有:
简化后就是:
中括号内的即为VAE的损失函数。
]]>
计算机的设计思想、设计原理、设计技术。
运算器、控制器、存储器、输入设备、输出设备。
性能计算:
$CPUTime = \frac{Seconds}{Program} = \frac{Instruction}{Program} \cdot \frac{Cycles}{Instruction} \cdot \frac{Seconds}{Cycles}$
性能提升:
网络技术 | 速度 | 存储接口 | 速度 |
---|---|---|---|
WAN T1 | 56K/s | SCSI | 5MB/s |
以太网 | 10Mb/s | Fast SCSI | 10MB/s |
快速以太网 | 100Mb/s | WideSCSI | 20MB/s |
ATM/OC-3 | 155Mb/s | Ultra SCSI | 40MB/s |
千兆以太网 | 1Gb/s | 光纤路径 | 2Gb/s |
Infiniband | 40Gb/s | 光纤路径 | 4 or 8Gb/s |
网络比存储发展快!
存储技术的目标:最大,最快,最便宜。
技术趋势:
局部性原理:
层次:SRAM,DRAM,DISK,FLASH MEMORY
Cache:
使用Cache的问题:
访问缺失:
$AMAT = \text{命中时间} + \text{缺失率} * \text{缺失代价}$
优化度量:命中时间,缺失率,缺失代价,缓存带宽和功耗。
提升性能方法:
单CPU主要的并行:指令级并行(ILP)
三步骤:
基准程序(Benchmarks):
类别:
Hazard:指流水线遇到无法正确执行后续指令或执行了不该执行的指令
解决方法:
第一阶段 | 第二阶段 | 第三阶段 | 第四阶段 | 第五阶段 |
---|---|---|---|---|
Ifetch | Reg/Dec | Exec | Mem | Wr |
Tips:这里寄存器读口和写口可看成两个不同的部件
比较:
一般采用二位预测位!
2018年12月3日
战场,考场
聒噪,沉静
忐忑,镇定
顾盼,专心
窃喜,自信
得意忘形,波澜不惊
举世皆浊我独清
众人皆醉我独醒
入坑微博图床,七牛云拜拜您嘞!
笔者刚开始写博客时使用的时Hexo
自带的七牛云插件。只需在本地文件夹中放入图片,然后部署时同步到七牛云的测试域名中,即可在文章中插图,着实方便省心。然而却没有注意的是七牛云的测试域名只有三十天寿命,时间一到就会被收回,所以昨天博客的图片就全军覆没了。还好笔者还小心地保留着本地图片,不然真的是陪了夫人又折兵。
感叹当时没有做好功课,看到七牛云被多数推崇就傻傻地开始使用。后悔之余还是需要处理烂摊子的,于是笔者开始折腾起来:
GitHub
和Coding
上摸爬滚打的穷学生显然是一条绝路。好在笔者的图片不多,亡羊补牢为时未晚。
吸取教训:学习知识与掌握工具应寻根探底,知其所以然,切忌人云亦云,切勿急功近利。保持怀疑,保持好奇。
]]>我不能创造的东西,我就不了解。
——理查德·菲利普·费曼
Lab 快点成熟起来吧,扩展和主题让人绝望!
使用Anaconda
的用户在创建好新环境之后会遇到一个问题——Anaconda
自带的Jupyter Notebook
或Jupyter Lab
并没有把新环境添加到Kernel
中去。当然,可以在每个新建的环境中都安装Jupyter
,可行但是不优雅。那么解决方法如下:
Anacodna Prompt
中激活创建的环境py36
:conda activate py36
ipykernel
:pip install ipykernel
python -m ipykernel install --name py36 --display-name "py36"
--name
参数后的py36
是内核名称,用于系统保存。而--display-name
参数后的"Py36"
是在Jupyter Notebook
网页中选择或切换内核时所显示的。建议二者设置为一样的,方便以后删除Kernel
。
如果非要设置一个--display-name
,然而一段时间后又忘了当时--name
是什么了。那么查看所有Kernel
,可在CMD
中输入:
jupyter kernelspec list
删除内核时,可在CMD
中输入:
jupyter kernelspec remove py36
在C:\Users\usersname\.jupyter
文件夹中打开jupyter_notebook_config.py
文件,找到字段:
# The directory to use for notebooks and kernels. #c.NotebookApp.notebook_dir = ''
删除#
,并在单引号中添加所需修改的路径,譬如:
# The directory to use for notebooks and kernels. c.NotebookApp.notebook_dir = 'E:\jupyter workspace'
Enter : 转入编辑模式
Shift-Enter : 运行本单元,选中下个单元
Ctrl-Enter : 运行本单元
Alt-Enter : 运行本单元,在其下插入新单元
Y : 单元转入代码状态
M :单元转入markdown状态
R : 单元转入raw状态
1 : 设定 1 级标题
2 : 设定 2 级标题
3 : 设定 3 级标题
4 : 设定 4 级标题
5 : 设定 5 级标题
6 : 设定 6 级标题
Up : 选中上方单元
K : 选中上方单元
Down : 选中下方单元
J : 选中下方单元
Shift-K : 扩大选中上方单元
Shift-J : 扩大选中下方单元
A : 在上方插入新单元
B : 在下方插入新单元
X : 剪切选中的单元
C : 复制选中的单元
Shift-V : 粘贴到上方单元
V : 粘贴到下方单元
Z : 恢复删除的最后一个单元
D,D : 删除选中的单元
Shift-M : 合并选中的单元
Ctrl-S : 文件存盘
S : 文件存盘
L : 转换行号
O : 转换输出
Shift-O : 转换输出滚动
Esc : 关闭页面
Q : 关闭页面
H : 显示快捷键帮助
I,I : 中断Notebook内核
0,0 : 重启Notebook内核
Shift : 忽略
Shift-Space : 向上滚动
Space : 向下滚动
Tab : 代码补全或缩进
Shift-Tab : 提示
Ctrl-] : 缩进
Ctrl-[ : 解除缩进
Ctrl-A : 全选
Ctrl-Z : 复原
Ctrl-Shift-Z : 再做
Ctrl-Y : 再做
Ctrl-Home : 跳到单元开头
Ctrl-Up : 跳到单元开头
Ctrl-End : 跳到单元末尾
Ctrl-Down : 跳到单元末尾
Ctrl-Left : 跳到左边一个字首
Ctrl-Right : 跳到右边一个字首
Ctrl-Backspace : 删除前面一个字
Ctrl-Delete : 删除后面一个字
Esc : 进入命令模式
Ctrl-M : 进入命令模式
Shift-Enter : 运行本单元,选中下一单元
Ctrl-Enter : 运行本单元
Alt-Enter : 运行本单元,在下面插入一单元
Ctrl-Shift— : 分割单元
Ctrl-Shift-Subtract : 分割单元
Ctrl-S : 文件存盘
Shift : 忽略
Up : 光标上移或转入上一单元
Down :光标下移或转入下一单元
文章来源:2018-TNNLS
Tips:
本文考虑异构领域适应的五方面:
主旨:
总体目标:
维度差异和特征失配问题:
将领域特征分别经$\bf P_{s}$、$\bf P_{t}$投影到同一维度,并通过共享字典$\bf B$来学的一个新的特征空间。
文章来源:2018-TNNLS
寻找领域不变特征一般分为三类:
为了实现两个领域的迁移需要减小其分布差异:
问渠那得清如许?为有源头活水来。
信息熵的本质是香农信息量$log\frac{1}{p}$的期望。
离散:
连续:
香农信息量的意义:一个事件出现的概率越低,对其编码的长度越大。(huffman编码的思想。)
熵的意义:最短平均编码长度。(因为我们用真实分布$p_i$来编码,编码方案是最优的。)
交叉熵的本质是对估计分布的编码长度。todo
离散:
连续:
交叉熵的意义:估计平均编码长度。(用一个估计分布$q_i$来编码一个真实分布$p_i$,编码不一定是最优的。)
可证明$H(p,q)\le H(p)$,当且仅当$p=q$时等号成立。
又称KL散度或信息增益,用来衡量来个分布之间的差异,具有不对称性。
相对熵的意义:估计平均编码长度相较于最短平均编码长度的冗余。
因$p(x_0)$,已知。故等价于:
给定m维数据的n个样本,用$m \times n$矩阵${X=[\mathbf{x}_{1},\mathbf{x}_{2},\ldots ,\mathbf{x}_{n}]}$。其表示样本均值为:
$$\overline { {\mathbf {x} } }={\frac {1}{n}}\sum _{ {j=1} }^{n}{\mathbf {x}}_{j}$$其中${\mathbf {x} _{j}}$表示$X$矩阵的第$j$列。
$n \times n$的中心矩阵可表示为:
$I_{n}$为单位矩阵, $\phi$表示全为1的矩阵。
散度矩阵$S$可表示为:
或
一般的$L = D - \frac{S^T+S}{2}$,其中$D$为对角矩阵,元素为$\sum(s_{ij}+s_{ji})/2$。
性质:对称,半正定。
对于特征向量$\bf x$有:
对于特征矩阵$\bf X$有:
不写数学公式跟咸鱼有什么区别。
{{}}
或{% %}
会导致解析Bug。(尤其在使用数学公式时需注意)
官方给出的解决方案为:
{% raw %}{{Balabala}} or {% Balabala %}{% endraw %}
然而这样十分不利于博客的迁移。
解决解决方案:
npm uninstall hexo-renderer-marked --savenpm install hexo-renderer-kramed --save
\node_modules\kramed\lib\rules\inline.js
路径中的代码如下:var inline = {//escape: /^\\([\\`*{}\[\]()#$+\-.!_>])/,escape: /^\\([`*\[\]()#$+\-.!_>])/,autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,url: noop,html: /^<!--[\s\S]*?-->|^<(\w+(?!:\/|[^\w\s@]*@)\b)*?(?:"[^"]*"|'[^']*'|[^'">])*?>([\s\S]*?)?<\/\1>|^<(\w+(?!:\/|[^\w\s@]*@)\b)(?:"[^"]*"|'[^']*'|[^'">])*?>/,link: /^!?\[(inside)\]\(href\)/,reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,reffn: /^!?\[\^(inside)\]/,strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,//em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,em: /^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br: /^ {2,}\n(?!\s*$)/,del: noop,text: /^[\s\S]+?(?=[\\<!\[_*`$]| {2,}\n|$)/,math: /^\$\$\s*([\s\S]*?[^\$])\s*\$\$(?!\$)/,};
{ {
和{ \{
时中间添加一个空格即可。