bic算法
Ⅰ 序列比对及算法模式的选择
选择序列比对的方法:Muscle或者ClustalW。 ClustalW 的基本原理是首先做序列的两两比对,根据该两两比对计算两两距离矩阵,是一种经典的比对方法,使用范围也比较广泛。 Muscle 的功能仅限于多序列比对,它的最大优势是速度,比ClustalW的速度快几个数量级,而且序列数越多速度的差别越大。方法可以通过点击图中上方Alignment或者下方的图标“W”和“Muscle”来选择。如果你的序列是 DNA编码序列 ,就一定要选择 Align Codons ,因为序列通过密码子比对比DNA序列的比对会更加真实,避免间隙对比对结果产生的影响。
(但是该选项会因为序列中含有终止密码而报错。)
比对之后要去检查一下比对的情况,有的差异很大的或许是因为序列方向反了,这个时候要把它反转回来,右击这条序列,点击Reverse Complement,反转后一定要再次点击比对,检查是否大部分都对齐了。
分析后返回主页面,接下来我们要选择一个最优的模型,提高建树的精确度。点击 MODELS 中的 Find Best DNA/Protein Models(ML) 软件就会根据你的数据帮你计算寻找最适合的模型。
分析计算结果。具有 最低BIC分数 (BayesianInformation Criterion)的模型被认为 是最好地描述替代模式 。对于每个模型,还给出了AICc值(Akaike Information Criterion, corrected,值越低拟合程度越好),以及用来计算上述两个分值的最大似然值(lnL)和参数数量(包括分支长度)。在这里就可以看到,BIC分数最低的模型是K2+G+I,K2+G+I在这里就是最好的模型。
但因为实际在后面的模型选择中, 软件有时没有提供组合的模型来选择 ,所以我们继续看下面的BIC分数,可以找到 单个模型 中得分 最小的 ,就是我们在这里要选择的最优模型。
Ⅱ BBR算法中轮数计算方法
轮数在拥塞算法中是一个重要的概念,基于丢包的拥塞算法中,比如reno算法在拥塞避免阶段,每轮进行一次拥塞窗口加1,bic算法也是每轮进行一次拥塞窗口增加,只是增加的幅度不同,而基于时延的拥塞算法,如vegas算法,检测出一轮内的最小rtt_us值,与rtt_min对比推断得到当前网络的数据包排队的情况。这些例子中可以看出,对于算法的实现都需要考虑轮数的统计。
那算法是如何计算轮数的呢?主要分为三种,一种形如reno,bic这类算法中,轮数的计算建立在 某一轮能发送snd_cwnd个数据包,当累计了snd_cwnd个数据包确认,就为一轮结束。算法中有个snd_cwnd_cnt变量用来累计当前轮已经收到了多少的数据包确认,当该值大于等于拥塞窗口snd_cwnd,就认为一轮结束了。
以reno为例,w为控制增窗的频率快慢,reno中等于snd_cwnd
void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w)
{
if (tp->snd_cwnd_cnt >= w) { //累计了snd_cwnd个ack数据包
if (tp->snd_cwnd < tp->snd_cwnd_clamp)//未超过申明的最大窗口值
tp->snd_cwnd++;
tp->snd_cwnd_cnt = 0; //累计ack个数清零
} else {//累计ack个数
tp->snd_cwnd_cnt++;
}
}
第二类,如vegas这种基于时延的拥塞算法中,用序列号进行区分,记录某一轮的起始点对应的snd_nxt,当snd_nxt所对应的数据包没有发生重传,被接收端ack确认的时间即为一个rtt,也就是一轮,如下图所示,数据包a被ack确认时,只有线段SEQ1以上的数据包是之后发送的,当这区间某个数据包被ack确认,说明已经经过了一轮rtt,新一轮中,只有线段SEQ2以上的数据包是之后发送的。
以vegas算法为例,
if (after(ack, vegas->beg_snd_nxt)) {
/* Do the Vegas once-per-RTT cwnd adjustment. */
/* Save the extent of the current window so we can use this
* at the end of the next RTT.
*/
vegas->beg_snd_nxt = tp->snd_nxt;
...
}
第三种就是bbr算法中所使用的轮数计算方法,用时间来区分,每个数据包发送都记录当前交付到对端的数据包个数delivered,某一时刻T为一轮的起始点,对应的交付到对端个数为D,时间小于T的记录的delivered都小于D,之后发送的数据包记录的delivered都大于等于D,当接收端收到ack(sack)数据包对应发送的delivered大于等于D,说明T时刻之后发送的数据包至少有个一到达了接收端,即经过了一轮RTT。
如上图所示,时刻T1所对应的tp->delivered 为D,那时刻T1右侧发送的数据包都是之后发送的,记录prior_delivered都大于等于D,当两个重传数据包被ack确认时,其对应的prior_delivered都为D,说明T1时刻之后发送的两个数据包经过一个RTT传输已经被接收,已经经过了一轮,开始了新一轮,而此时tp->delivered为D+2,之后发送的数据包记录的prior_delivered都大于等于D+2,当收到ack确认的数据包记录的prior_delivered大于等于D+2,说明时间已经又过了一轮,新一轮已经开始。
/* See if we've reached the next RTT */
if (!before(rs->prior_delivered, bbr->next_rtt_delivered)) {
bbr->next_rtt_delivered = tp->delivered;
bbr->rtt_cnt++;
bbr->round_start = 1;
...
}
rs->prior_delivered就为每个ack(sack)确认的包发送时记录的tp->delivered值,当其大于等于某一轮起始的delivered值,就为新一轮开始。
这三种不同的方法,bic算法中这样处理是由于比如窗口每轮增加5个包,并不是一轮结束后窗口加5,而是每经过1/5的窗口值就进行拥塞窗口加1的操作。vegas算法中,需要统计一轮内最小rtt_us,需要知道某一轮的起始和结束点,定期的重置当前轮内追踪到的最小rtt_us以及调整窗口值。然而,BBR算法不仅负责拥塞避免阶段的发包,而且还接管了拥塞丢包状态下发包行为,而vegas算法中的轮数计算只能用于不丢包的open/disorder状态,假设某个时刻发生大面积丢包,拥塞窗口骤降,需要经过两三轮的重传才能重传完毕,才能推进snd_una,进而更新轮数。这对BBR来说是非常不合适了,因为已经拥塞丢包了,网络状况很有可能已经变差了,而这时却因为计算出来的轮数偏小,不能及时的更新最大带宽值,进而延迟了网络处于拥塞的状态时间。
Ⅲ TCP拥塞控制及BBR原理分析
导语:TCP拥塞控制不仅仅是网络层的概念,可以将其归属于控制论的范畴。在TCP的演进过程中,出现了很多优秀的思想和算法,以实现网络传输过程中,在公平竞争性的前提下,尽可能地利用带宽资源。本文介绍TCP发展过程中出现的几种拥塞控制算法,并着重介绍BBR的原理。
TCP拥塞控制不仅仅是网络层的概念,可以将其归属于控制论的范畴。在TCP的演进过程中,出现了很多优秀的思想和算法,以实现网络传输过程中,在公平竞争性的前提下,尽可能地利用带宽资源。
公平性是在发生拥塞时各源端(或同一源端建立的不同TCP连接或UDP数据报)能公平地共享同一网络资源(如带宽、缓存等)。处于相同级别的源端应该得到相同数量的网络资源。产生公平性的根本原因在于拥塞发生必然导致数据包丢失,而数据包丢失会导致各数据流之间为争抢有限的网络资源发生竞争,争抢能力弱的数据流将受到更多损害。因此,没有拥塞,也就没有公平性问题。
TCP层上的公平性问题表现在两方面:
(1)面向连接的TCP和无连接的UDP在拥塞发生时对拥塞指示的不同反应和处理,导致对网络资源的不公平使用问题。在拥塞发生时,有拥塞控制机制的TCP会按拥塞控制步骤进入拥塞避免阶段,从而主动减小发送到网络的数据量。但对无连接的数据报UDP,由于没有端到端的拥塞控制机制,即使网络出现了拥塞,也不会减少向网络发送的数据量。结果遵守拥塞控制的TCP数据流得到的网络资源越来越少,没有拥塞控制的UDP则会得到越来越多的网络资源。
(2)TCP连接之间也存在公平性问题。产生问题的原因在于使用了不同的拥塞控制算法,一些TCP在拥塞前使用了大窗口尺寸,或者它们的RTT较小,或者数据包比其他TCP大,这样它们也会多占带宽。
拥塞控制主要包括四个过程:1)慢启动;2)拥塞避免;3)拥塞发生;4)快速恢复。
RTT :数据包从发出去到收到对它的ack的来回时间,采用平滑方式计算RTT
RTO :重传超时。简单的如RTO=n*RTT, n=3(或其他RTO计算方法)
SACK :TCP Option携带多组ACK信息
FR :Fast Retransmission,收到3个p ack后,即可认为发生了丢包。不需要等待RTO超时即可重传丢失的包。
ER :Early Retransmission,无法产生足够的pack和没有新的数据包可以发送进入网络的情况下,减少触发FR的p ack数量,以达到触发FR的目的。
TLP :如果发生了尾丢包,由于尾包后面没有更多的数据包,也就没有办法触发任何的pack。实际上,Google统计超过70%的RTO是尾丢包导致没有任何p
ack 。TLP算法是通过发送一个loss probe包,来产生足够的SACK/FACK的信息以触发RF。
Pacing :控制发送速率,防止bursting
流控 :Flow control站在单条TCP连接的维度,目的是让发送方发包的速度,不超过接收方收包的能力。所以流控解决的问题是,如何在接收方可承受的范围内,让单条 TCP 连接的速度最大化。通过滑动窗口机制实现。
拥塞控制 :Congestion control站在整个互联网的维度,让网络里所有TCP连接最大化共享网络通道的同时,尽可能的少出现网络拥塞现象,让网络世界里的每一个参与者既公平又高效。
cwnd :发送窗口,拥塞窗口;在拥塞控制过程中窗口大小值变化。
rwnd :接收窗口,通知发送者能够发送的数据大小。
sliding window :滑动窗口,只是一种抽象机制概念;在发送请求及收到ack的过程中滑动。
历史上出现的各种TCP拥塞控制算法,其本质是针对拥塞控制的四个过程做策略调整。按照算法依据的因素,可以简单的分为以下类型:
因为Reno等算法是后续算法的基础,这里详细的描述下Reno算法的过程。
(1)慢热启动算法 – Slow Start
(2)拥塞避免算法 – Congestion Avoidance
当cwnd >= ssthresh时,就会进入“拥塞避免算法”。算法如下:
(3)拥塞状态算法 – Fast Retransmit
Tahoe是等RTO超时,FR是在收到3个plicate ACK时就开启重传,而不用等到RTO超时。拥塞发生时:
(4)快速恢复 – Fast Recovery
Reno算法以其简单、有效和鲁棒性,应用最广泛。该算法所包含的慢启动、拥塞避免和快速重传、快速恢复机制,是现有的众多算法的基础。从Reno运行机制中很容易看出,为了维持一个动态平衡,必须周期性地产生一定量的丢失,再加上AIMD机制--减少快,增长慢,尤其是在大窗口环境下,由于一个数据报的丢失所带来的窗口缩小要花费很长的时间来恢复,这样,带宽利用率不可能很高且随着网络的链路带宽不断提升,这种弊端将越来越明显。另外,丢包并不一定是网络拥塞,可能是网络常态,但是基于丢包的拥塞控制并不能区分。
vegas通过对RTT的非常重的监控来计算一个基准RTT。然后通过这个基准RTT来估计当前的网络实际带宽,如果实际带宽比我们的期望的带宽要小或是要多的活,那么就开始线性地减少或增加cwnd的大小。
中间路由器缓存数据导致RTT变大,认为发生拥塞;RTT不公平性,当不同的数据流对网络瓶颈带宽进行竞争时,具有较小RTT的TCP数据流的拥塞窗口增加速率将会快于具有大RTT的TCP数据流,从而将会占有更多的网络带宽资源。
在发送端做带宽估计,当探测到丢包时,根据带宽值来设置拥塞窗口、慢启动阈值。 那么,这个算法是怎么测量带宽的?每个RTT时间,会测量一次带宽,测量带宽的公式很简单,就是这段RTT内成功被ACK了多少字节。Westwood会根据RTT变化来判断丢包是否是网络拥塞造成的,还是网络常态的丢包。如果时延变化不明显,就认为是非网络拥塞,此时cwnd减少的比较小。
BIC-TCP是Linux 2.6.18默认拥塞控制算法,依赖丢包条件触发。BIC-TCP认为TCP拥塞窗口调整的本质就是找到最适合当前网络的一个发送窗口,为了找到这个窗口值,TCP采取的方式是(拥塞避免阶段)每RTT加1,缓慢上升,丢包时下降一半,接着再来慢慢上升。BIC-TCP的提出者们看穿了事情的本质,其实这就是一个搜索的过程,而TCP的搜索方式类似于逐个遍历搜索方法,可以认为这个值是在1和一个比较大的数(large_window)之间,既然在这个区间内需要搜索一个最佳值,那么显然最好的方式就是二分搜索思想。
BIC-TCP就是基于这样一个二分思想的:当出现丢包的时候,说明最佳窗口值应该比这个值小,那么BIC就把此时的cwnd设置为max_win,把乘法减小后的值设置为min_win,然后BIC就开始在这两者之间执行二分思想--每次跳到max_win和min_win的中点。
BIC也具备RTT的不公平性。RTT小的连接,窗口调整发生的速度越快,因此可能更快的抢占带宽。
CUBIC在设计上简化了BIC-TCP的窗口调整算法,在BIC-TCP的窗口调整中会出现一个凹和凸(这里的凹和凸指的是数学意义上的凹和凸,凹函数/凸函数)的增长曲线,CUBIC使用了一个三次函数(即一个立方函数),在三次函数曲线中同样存在一个凹和凸的部分,该曲线形状和BIC-TCP的曲线图十分相似,于是该部分取代BIC-TCP的增长曲线。另外,CUBIC中最关键的点在于它的窗口增长函数仅仅取决于连续的两次拥塞事件的时间间隔值,从而窗口增长完全独立于网络的时延RTT,使得连接之间保持良好的RRTT公平性。
来看下具体细节:当某次拥塞事件发生时,Wmax设置为此时发生拥塞时的窗口值,然后把窗口进行乘法减小,乘法减小因子设为β,当从快速恢复阶段退出然后进入到拥塞避免阶段,此时CUBIC的窗口增长开始按照“凹”式增长曲线进行增长,该过程一直持续直到窗口再次增长到Wmax,紧接着,该函数转入“凸”式增长阶段。该方式的增长可以使得窗口一直维持在Wmax附近,从而可以达到网络带宽的高利用率和协议本身的稳定性。
CUBIC窗口的增长函数:W(t) = C * (t-K)3 + Wmax, 其中C和β为常量。
t为当前时间距上一次窗口减小的时间差,而K就代表该函数从W增长到Wmax的时间周期。
通俗一点讲,假如我们知道了Wmax,那么CUBIC的核心思想就是需要在连续两次拥塞期间执行完上面的三次函数增长曲线
BBR通过实时计算带宽和最小RTT来决定发送速率pacing rate和窗口大小cwnd。完全摒弃丢包作为拥塞控制的直接反馈因素。
传统的拥塞控制算法是计算cwnd值来规定当前可以发送多少数据,但是并不关注以什么样的速度发送数据。如果简单而粗暴地将窗口大小(send.cwnd、recv.cwnd的最小值)数据全部突发出去,这往往会造成路由器的排队,在深队列的情况下,会测量出rtt剧烈地抖动。bbr在计算cwnd的同时,还计算了一个与之适配的pacing rate,该pacing rate规定cwnd指示的一窗数据的数据包之间,以多大的时间间隔发送出去。
我们知道,网络工作的最优点是在物理链路延迟状态下,以最大速率传输数据。传统的拥塞控制算法思想是根据数据传输及ACK来确定RTT,但是这个RTT并不是物理链路延时,可能包含了路由器缓存耗时,也可能是拥塞状态下的耗时。传统的带宽计算也是在不断的试探逼近最优发送窗口,并在RTT或者统计周期内计算带宽。这种情况下,RTT并不是真正的物理链路延迟,带宽也有可能是在有路由缓存或丢包状况下计算得到,那么必然得到的不是精准的值。
BBR摒弃了丢包和实时RTT作为拥塞控制因素。引入BDP管道容量来衡量链路传输水平。BBR追求的是在链路最小RTT(物理链路延迟)的状态下,找到最大带宽。
首先我们认为网络最优点是可以达到的。下面描述RTT及收包速率与数据包投递速率的关系。
图中上半部分的过程可以描述为:随着数据包投递速率增加,如果没有超过最优带宽,则RTT不会变化,此时的RTT是物理链路延迟。随着投递速率继续增加,这时中间路由节点可能出现需要缓存数据包的情况,这会导致RTT变大。如果投递速率继续增加,超过路由缓存能力,则可能出现丢包。
图中下半部分的过程可以描述为:随着数据包投递速率增加,如果没有超过最优带宽,则发送方确认接收端收到的数据速率增加。随着投递速率继续增加,因为数据包缓存在中间路由,这些包并不能及时得到ACK,因此发送方得到的ACK速率,即发送发确认接收方收到数据的速率会维持不变。如果投递速率继续增加,超过路由缓存能力,则可能出现丢包。
1)应答了多少数据,记为delivered;
2)应答1)中的delivered这么多数据所用的时间,记为interval_us。
将上述二者相除,就能得到带宽:bw = delivered/interval_us;该计算方法不关注数据包ack及顺序,是纯粹的标量。
我们可以根据图示很容易算出从Delivered为7时的数据包被确认到X被确认为止,一共有12-7=5个数据包被确认,即这段时间网络上清空了5个数据包。我们便很容易算出带宽值了。
当10s内没有发现最小RTTProp时,就要进入ProbeRTT状态。在ProbeRTT状态,仅发4MSS/RTT(接近停止发送),从而排空链路上的数据包,测量真实的RTTProp。这里带来的一个问题是,在一个RTT时间内以4MSS速率发送可能会造成抖动,特别是长RTT场景。具体的参考willko文章《GBN手札-BBR实时大数据传输之痛》。
Ⅳ Linear least squares,Lasso,ridge regression有何本质区别
Linearleastsquares,Lasso,ridgeregression三者是有本质区别的。一、最小二乘法(Linearleastsquares)。最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。二、套索工具(Lasso)算法。套索工具源于Photoshop,在PhotoshopCS6中,需要自由绘制出形状不规则的选区时,可以使用套索工具。选择使用套索工具后,在图像上拖拽鼠标指针绘制选区边界,松开鼠标左键时,选区将会进行自动闭合。套索工具算法,通过构造一个惩罚函数获得一个精炼的模型;通过最终确定一些指标的系数为零,套索工具算法实现了指标集合精简的目的。这是一种处理具有复共线性数据的有偏估计。套索工具的基本思想是在回归系数的绝对值之和小于一个常数的约束条件下,使残差平方和最小化,从而能够产生某些严格等于0的回归系数,得到解释力较强的模型。R统计软件的Lars算法的软件包提供了套索工具算法。根据模型改进的需要,数据挖掘工作者可以借助于套索工具算法,利用AIC准则和BIC准则精炼简化统计模型的变量集合,达到降维的目的。因此,套索工具算法是可以应用到数据挖掘中的实用算法。三、岭回归算法(ridgeregression)。在回归分析中,用一种方法改进回归系数的最小二乘估计后所得的回归称为岭回归算法。在多元回归方程中,用最小二乘估计求得的回归系数值尽管是其真值β=(β0,β1,···βp)1的无偏估计,但若将与β分别看成p+1维空间中两个点的话,它们之间的平均距离E(—β)1(-β)(称为均方差)仍可能很大,为减小此均方差,用(k)=(X′X+KI)-1X′Y去代替2,称(K)为β的岭回归估计。其中X为各变量的观测值所构成的一个n×(p+1)阶矩阵,Y是随机变量的观测值组成的n维向量,I为p+1阶单位阵,K是与未知参数有关的参数,选择它使E{[(K)-β]1[(K)-β]}达到最小。
Ⅳ 生物信息学
一, 生物信息学发展简介
生物信息学是建立在分子生物学的基础上的,因此,要了解生物信息学,就
必须先对分子生物学的发展有一个简单的了解.研究生物细胞的生物大分子的结
构与功能很早就已经开始,1866年孟德尔从实验上提出了假设:基因是以生物
成分存在[1],1871年Miescher从死的白细胞核中分离出脱氧核糖核酸(DNA),
在Avery和McCarty于1944年证明了DNA是生命器官的遗传物质以前,人们
仍然认为染色体蛋白质携带基因,而DNA是一个次要的角色.
1944年Chargaff发现了着名的Chargaff规律,即DNA中鸟嘌呤的量与胞嘧
定的量总是相等,腺嘌呤与胸腺嘧啶的量相等.与此同时,Wilkins与Franklin
用X射线衍射技术测定了DNA纤维的结构.1953年James Watson 和Francis
Crick在Nature杂志上推测出DNA的三维结构(双螺旋).DNA以磷酸糖链形
成发双股螺旋,脱氧核糖上的碱基按Chargaff规律构成双股磷酸糖链之间的碱基
对.这个模型表明DNA具有自身互补的结构,根据碱基对原则,DNA中贮存的
遗传信息可以精确地进行复制.他们的理论奠定了分子生物学的基础.
DNA双螺旋模型已经预示出了DNA复制的规则,Kornberg于1956年从大
肠杆菌(E.coli)中分离出DNA聚合酶I(DNA polymerase I),能使4种dNTP连接
成DNA.DNA的复制需要一个DNA作为模板.Meselson与Stahl(1958)用实验
方法证明了DNA复制是一种半保留复制.Crick于1954年提出了遗传信息传递
的规律,DNA是合成RNA的模板,RNA又是合成蛋白质的模板,称之为中心
法则(Central dogma),这一中心法则对以后分子生物学和生物信息学的发展都起
到了极其重要的指导作用.
经过Nirenberg和Matthai(1963)的努力研究,编码20氨基酸的遗传密码
得到了破译.限制性内切酶的发现和重组DNA的克隆(clone)奠定了基因工程
的技术基础.
正是由于分子生物学的研究对生命科学的发展有巨大的推动作用,生物信息
学的出现也就成了一种必然.
2001年2月,人类基因组工程测序的完成,使生物信息学走向了一个高潮.
由于DNA自动测序技术的快速发展,DNA数据库中的核酸序列公共数据量以每
天106bp速度增长,生物信息迅速地膨胀成数据的海洋.毫无疑问,我们正从一
个积累数据向解释数据的时代转变,数据量的巨大积累往往蕴含着潜在突破性发
现的可能,"生物信息学"正是从这一前提产生的交叉学科.粗略地说,该领域
的核心内容是研究如何通过对DNA序列的统计计算分析,更加深入地理解DNA
序列,结构,演化及其与生物功能之间的关系,其研究课题涉及到分子生物学,
分子演化及结构生物学,统计学及计算机科学等许多领域.
生物信息学是内涵非常丰富的学科,其核心是基因组信息学,包括基因组信
息的获取,处理,存储,分配和解释.基因组信息学的关键是"读懂"基因组的核
苷酸顺序,即全部基因在染色体上的确切位置以及各DNA片段的功能;同时在
发现了新基因信息之后进行蛋白质空间结构模拟和预测,然后依据特定蛋白质的
功能进行药物设计[2].了解基因表达的调控机理也是生物信息学的重要内容,根
据生物分子在基因调控中的作用,描述人类疾病的诊断,治疗内在规律.它的研
究目标是揭示"基因组信息结构的复杂性及遗传语言的根本规律",解释生命的遗
传语言.生物信息学已成为整个生命科学发展的重要组成部分,成为生命科学研
究的前沿.
二, 生物信息学的主要研究方向
生物信息学在短短十几年间,已经形成了多个研究方向,以下简要介绍一些
主要的研究重点.
1,序列比对(Sequence Alignment)
序列比对的基本问题是比较两个或两个以上符号序列的相似性或不相似
性.从生物学的初衷来看,这一问题包含了以下几个意义[3]:
从相互重叠的序列片断中重构DNA的完整序列.
在各种试验条件下从探测数据(probe data)中决定物理和基因图
存贮,遍历和比较数据库中的DNA序列
比较两个或多个序列的相似性
在数据库中搜索相关序列和子序列
寻找核苷酸(nucleotides)的连续产生模式
找出蛋白质和DNA序列中的信息成分
序列比对考虑了DNA序列的生物学特性,如序列局部发生的插入,删除(前
两种简称为indel)和替代,序列的目标函数获得序列之间突变集最小距离加权
和或最大相似性和,对齐的方法包括全局对齐,局部对齐,代沟惩罚等.两个
序列比对常采用动态规划算法,这种算法在序列长度较小时适用,然而对于海
量基因序列(如人的DNA序列高达109bp),这一方法就不太适用,甚至采用算
法复杂性为线性的也难以奏效.因此,启发式方法的引入势在必然,着名的
BALST和FASTA算法及相应的改进方法均是从此前提出发的.
2, 蛋白质结构比对和预测
基本问题是比较两个或两个以上蛋白质分子空间结构的相似性或不相似性.
蛋白质的结构与功能是密切相关的,一般认为,具有相似功能的蛋白质结构一般
相似.蛋白质是由氨基酸组成的长链,长度从50到1000~3000AA(Amino Acids),
蛋白质具有多种功能,如酶,物质的存贮和运输,信号传递,抗体等等.氨基酸
的序列内在的决定了蛋白质的3维结构.一般认为,蛋白质有四级不同的结构.
研究蛋白质结构和预测的理由是:医药上可以理解生物的功能,寻找docking
drugs的目标,农业上获得更好的农作物的基因工程,工业上有利用酶的合成.
直接对蛋白质结构进行比对的原因是由于蛋白质的3维结构比其一级结构
在进化中更稳定的保留,同时也包含了较AA序列更多的信息.
蛋白质3维结构研究的前提假设是内在的氨基酸序列与3维结构一一对应
(不一定全真),物理上可用最小能量来解释.
从观察和总结已知结构的蛋白质结构规律出发来预测未知蛋白质的结构.同
源建模(homology modeling)和指认(Threading)方法属于这一范畴.同源建模用
于寻找具有高度相似性的蛋白质结构(超过30%氨基酸相同),后者则用于比较
进化族中不同的蛋白质结构.
然而,蛋白结构预测研究现状还远远不能满足实际需要.
3, 基因识别,非编码区分析研究.
基因识别的基本问题是给定基因组序列后,正确识别基因的范围和在基因组
序列中的精确位置.非编码区由内含子组成(introns),一般在形成蛋白质后被丢
弃,但从实验中,如果去除非编码区,又不能完成基因的复制.显然,DNA序
列作为一种遗传语言,既包含在编码区,又隐含在非编码序列中.分析非编码
区DNA序列目前没有一般性的指导方法.
在人类基因组中,并非所有的序列均被编码,即是某种蛋白质的模板,已
完成编码部分仅占人类基因总序列的3~5%,显然,手工的搜索如此大的基因序
列是难以想象的.
侦测密码区的方法包括测量密码区密码子(codon)的频率,一阶和二阶马尔
可夫链,ORF(Open Reading Frames),启动子(promoter)识别,HMM(Hidden
Markov Model)和GENSCAN,Splice Alignment等等.
4, 分子进化和比较基因组学
分子进化是利用不同物种中同一基因序列的异同来研究生物的进化,构建进
化树.既可以用DNA序列也可以用其编码的氨基酸序列来做,甚至于可通过相
关蛋白质的结构比对来研究分子进化,其前提假定是相似种族在基因上具有相似
性.通过比较可以在基因组层面上发现哪些是不同种族中共同的,哪些是不同的.
早期研究方法常采用外在的因素,如大小,肤色,肢体的数量等等作为进化
的依据.近年来较多模式生物基因组测序任务的完成,人们可从整个基因组的角
度来研究分子进化.在匹配不同种族的基因时,一般须处理三种情况:
Orthologous: 不同种族,相同功能的基因
Paralogous: 相同种族,不同功能的基因
Xenologs: 有机体间采用其他方式传递的基因,如被病毒注入的基因.
这一领域常采用的方法是构造进化树,通过基于特征(即DNA序列或蛋白
质中的氨基酸的碱基的特定位置)和基于距离(对齐的分数)的方法和一些传统
的聚类方法(如UPGMA)来实现.
5, 序列重叠群(Contigs)装配
根据现行的测序技术,每次反应只能测出500 或更多一些碱基对的序列,
如人类基因的测量就采用了短枪(shortgun)方法,这就要求把大量的较短的序列
全体构成了重叠群(Contigs).逐步把它们拼接起来形成序列更长的重叠群,直
至得到完整序列的过程称为重叠群装配.从算法层次来看,序列的重叠群是一个
NP-完全问题.
6, 遗传密码的起源
通常对遗传密码的研究认为,密码子与氨基酸之间的关系是生物进化历史上
一次偶然的事件而造成的,并被固定在现代生物的共同祖先里,一直延续至今.
不同于这种"冻结"理论,有人曾分别提出过选择优化,化学和历史等三种学说
来解释遗传密码.随着各种生物基因组测序任务的完成,为研究遗传密码的起源
和检验上述理论的真伪提供了新的素材.
7, 基于结构的药物设计
人类基因工程的目的之一是要了解人体内约10万种蛋白质的结构,功能,
相互作用以及与各种人类疾病之间的关系,寻求各种治疗和预防方法,包括药物
治疗.基于生物大分子结构及小分子结构的药物设计是生物信息学中的极为重要
的研究领域.为了抑制某些酶或蛋白质的活性,在已知其蛋白质3级结构的基础
上,可以利用分子对齐算法,在计算机上设计抑制剂分子,作为候选药物.这一
领域目的是发现新的基因药物,有着巨大的经济效益.
8, 其他
如基因表达谱分析,代谢网络分析;基因芯片设计和蛋白质组学数据分析等,
逐渐成为生物信息学中新兴的重要研究领域;在学科方面,由生物信息学衍生的
学科包括结构基因组学,功能基因组学,比较基因组学,蛋白质学,药物基因组
学,中药基因组学,肿瘤基因组学,分子流行病学和环境基因组学.
从现在的发展不难看出,基因工程已经进入了后基因组时代.我们也有应对
与生物信息学密切相关的如机器学习,和数学中可能存在的误导有一个清楚的认
识.
三, 生物信息学与机器学习
生物信息的大规模给数据挖掘提出了新课题和挑战,需要新的思想的加入.
常规的计算机算法仍可以应用于生物数据分析中,但越来越不适用于序列分析问
题.究竟原因,是由于生物系统本质上的模型复杂性及缺乏在分子层上建立的完
备的生命组织理论.
西蒙曾给出学习的定义:学习是系统的变化,这种变化可使系统做相同工作
时更有效[4].机器学习的目的是期望能从数据中自动地获得相应的理论,通过采
用如推理,模型拟合及从样本中学习,尤其适用于缺乏一般性的理论,"噪声"
模式,及大规模数据集.因此,机器学习形成了与常规方法互补的可行的方法.
机器学习使得利用计算机从海量的生物信息中提取有用知识,发现知识成为可能
[5].
机器学习方法在大样本,多向量的数据分析工作中发挥着日益重要的作用,
而目前大量的基因数据库处理需要计算机能自动识别,标注,以避免即耗时又花
费巨大的人工处理方法.早期的科学方法—观测和假设----面对高数据的体积,
快速的数据获取率和客观分析的要求---已经不能仅依赖于人的感知来处理了.因
而,生物信息学与机器学习相结合也就成了必然.
机器学习中最基本的理论框架是建立在概率基础上的,从某种意义来说,是
统计模型拟合的延续,其目的均为提取有用信息.机器学习与模式识别和统计推
理密切相关.学习方法包括数据聚类,神经网络分类器和非线性回归等等.隐马
尔可夫模型也广泛用于预测DNA的基因结构.目前研究重心包括:1)观测和
探索有趣的现象.目前ML研究的焦点是如何可视化和探索高维向量数据.一般
的方法是将其约简至低维空间,如常规的主成分分析(PCA),核主成分分析
(KPCA),独立成分分析(Independent component analysis),局部线性嵌套(Locally
Linear embedding).2)生成假设和形式化模型来解释现象[6].大多数聚类方法可
看成是拟合向量数据至某种简单分布的混合.在生物信息学中聚类方法已经用于
microarray数据分析中,癌症类型分类及其他方向中.机器学习也用于从基因数
据库中获得相应的现象解释.
机器学习加速了生物信息学的进展,也带了相应的问题.机器学习方法大多
假定数据符合某种相对固定的模型,而一般数据结构通常是可变的,在生物信息
学中尤其如此,因此,有必要建立一套不依赖于假定数据结构的一般性方法来寻
找数据集的内在结构.其次,机器学习方法中常采用"黑箱"操作,如神经网络
和隐马尔可夫模型,对于获得特定解的内在机理仍不清楚.
四, 生物信息学的数学问题
生物信息学中数学占了很大的比重.统计学,包括多元统计学,是生物信息
学的数学基础之一;概率论与随机过程理论,如近年来兴起的隐马尔科夫链模型
(HMM),在生物信息学中有重要应用;其他如用于序列比对的运筹学;蛋白质
空间结构预测和分子对接研究中采用的最优化理论;研究DNA超螺旋结构的拓
扑学;研究遗传密码和DNA序列的对称性方面的群论等等.总之,各种数学理
论或多或少在生物学研究中起到了相应的作用.
但并非所有的数学方法在引入生物信息学中都能普遍成立的,以下以统计学
和度量空间为例来说明.
1, 统计学的悖论
数学的发展是伴随悖论而发展的.对于进化树研究和聚类研究中最显着的悖
论莫过于均值了,如图1:
图1 两组同心圆的数据集
图1是两组同心圆构成的数据集,显然,两组数据集的均值均在圆点,这也
就说明了要采用常规的均值方法不能将这两类分开,也表明均值并不能带来更多
的数据的几何性质.那么,如果数据呈现类似的特有分布时,常有的进化树算法
和聚类算法(如K-均值)往往会得错误的结论.统计上存在的陷阱往往是由于
对数据的结构缺乏一般性认识而产生的.
2, 度量空间的假设
在生物信息学中,进化树的确立,基因的聚类等都需要引入度量的概念.举
例来说,距离上相近或具有相似性的基因等具有相同的功能,在进化树中满足分
值最小的具有相同的父系,这一度量空间的前提假设是度量在全局意义下成立.
那么,是否这种前提假设具有普适性呢
我们不妨给出一般的描述:假定两个向量为A,B,其中,
,则在假定且满足维数间线性无关的前提下,两个
向量的度量可定义为:
(1)
依据上式可以得到满足正交不变运动群的欧氏度量空间,这也是大多数生物信息
学中常采用的一般性描述,即假定了变量间线性无关.
然而,这种假设一般不能正确描述度量的性质,尤其在高维数据集时,不考
虑数据变量间的非线性相关性显然存在问题,由此,我们可以认为,一个正确的
度量公式可由下式给出:
(2)
上式中采用了爱因斯坦和式约定,描述了变量间的度量关系.后者在满足
(3)
时等价于(1),因而是更一般的描述,然而问题在于如何准确描述变量间的非线
性相关性,我们正在研究这个问题.
五, 几种统计学习理论在生物信息学中应用的困难
生物信息学中面对的数据量和数据库都是规模很大的,而相对的目标函数却
一般难以给出明确的定义.生物信息学面临的这种困难,可以描述成问题规模的
巨大以及问题定义的病态性之间的矛盾,一般从数学上来看,引入某个正则项来
改善性能是必然的[7].以下对基于这一思想产生的统计学习理论[8],Kolmogorov
复杂性[98]和BIC(Bayesian Information Criterion)[109]及其存在的问题给出简要介
绍.
支持向量机(SVM)是近来较热门的一种方法,其研究背景是Vapnik的统计
学习理论,是通过最大化两个数据集的最大间隔来实现分类,对于非线性问题则
采用核函数将数据集映射至高维空间而又无需显式描述数据集在高维空间的性
质,这一方法较之神经方法的好处在于将神经网络隐层的参数选择简化为对核函
数的选择,因此,受到广泛的注意.在生物信息学中也开始受到重视,然而,核
函数的选择问题本身是一个相当困难的问题,从这个层次来看,最优核函数的选
择可能只是一种理想,SVM也有可能象神经网络一样只是机器学习研究进程中
又一个大气泡.
Kolmogorov复杂性思想与统计学习理论思想分别从不同的角度描述了学习
的性质,前者从编码的角度,后者基于有限样本来获得一致收敛性.Kolmogorov
复杂性是不可计算的,因此由此衍生了MDL原则(最小描述长度),其最初只
适用于离散数据,最近已经推广至连续数据集中,试图从编码角度获得对模型参
数的最小描述.其缺陷在于建模的复杂性过高,导致在大数据集中难以运用.
BIC准则从模型复杂性角度来考虑,BIC准则对模型复杂度较高的给予大的
惩罚,反之,惩罚则小,隐式地体现了奥卡姆剃刀("Occam Razor")原理,近
年也广泛应用于生物信息学中.BIC准则的主要局限是对参数模型的假定和先验
的选择的敏感性,在数据量较大时处理较慢.因此,在这一方面仍然有许多探索
的空间.
六, 讨论与总结
人类对基因的认识,从以往的对单个基因的了解,上升到在整个基因组水平
上考察基因的组织结构和信息结构,考察基因之间在位置,结构和功能上的相互
关系.这就要求生物信息学在一些基本的思路上要做本质的观念转变,本节就这
些问题做出探讨和思索.
启发式方法:
Simond在人类的认知一书中指出,人在解决问题时,一般并不去寻找最优
的方法,而只要求找到一个满意的方法.因为即使是解决最简单的问题,要想得
到次数最少,效能最高的解决方法也是非常困难的.最优方法和满意方法之间的
困难程度相差很大,后者不依赖于问题的空间,不需要进行全部搜索,而只要能
达到解决的程度就可以了.正如前所述,面对大规模的序列和蛋白质结构数据集,
要获得全局结果,往往是即使算法复杂度为线性时也不能够得到好的结果,因此,
要通过变换解空间或不依赖于问题的解空间获得满意解,生物信息学仍需要人工
智能和认知科学对人脑的进一步认识,并从中得到更好的启发式方法.
问题规模不同的处理:
Marvin Minsky在人工智能研究中曾指出:小规模数据量的处理向大规模数
据量推广时,往往并非算法上的改进能做到的,更多的是要做本质性的变化.这
好比一个人爬树,每天都可以爬高一些,但要想爬到月球,就必须采用其他方法
一样.在分子生物学中,传统的实验方法已不适应处理飞速增长的海量数据.同
样,在采用计算机处理上,也并非依靠原有的计算机算法就能够解决现有的数据
挖掘问题.如在序列对齐(sequence Alignment)问题上,在小规模数据中可以采用
动态规划,而在大规模序列对齐时不得不引入启发式方法,如BALST,FASTA.
乐观中的隐扰
生物信息学是一门新兴学科,起步于20世纪90年代,至今已进入"后基因
组时代",目前在这一领域的研究人员均呈普遍乐观态度,那么,是否存在潜在
的隐扰呢
不妨回顾一下早期人工智能的发展史[11],在1960年左右,西蒙曾相信不出
十年,人类即可象完成登月一样完成对人的模拟,造出一个与人智能行为完全相
同的机器人.而至今为止,这一诺言仍然遥遥无期.尽管人工智能研究得到的成
果已经渗入到各个领域,但对人的思维行为的了解远未完全明了.从本质来看,
这是由于最初人工智能研究上定位错误以及没有从认识论角度看清人工智能的
本质造成的;从研究角度来看,将智能行为还原成一般的形式化语言和规则并不
能完整描述人的行为,期望物理科学的成功同样在人工智能研究中适用并不现
实.
反观生物信息学,其目的是期望从基因序列上解开一切生物的基本奥秘,从
结构上获得生命的生理机制,这从哲学上来看是期望从分子层次上解释人类的所
有行为和功能和致病原因.这类似于人工智能早期发展中表现的乐观行为,也来
自于早期分子生物学,生物物理和生物化学的成就.然而,从本质上来讲,与人
工智能研究相似,都是希望将生命的奥秘还原成孤立的基因序列或单个蛋白质的
功能,而很少强调基因序列或蛋白质组作为一个整体在生命体中的调控作用.我
们因此也不得不思考,这种研究的最终结果是否能够支撑我们对生物信息学的乐
观呢 现在说肯定的话也许为时尚早.
综上所述,不难看出,生物信息学并不是一个足以乐观的领域,究竟原因,
是由于其是基于分子生物学与多种学科交叉而成的新学科,现有的形势仍表现为
各种学科的简单堆砌,相互之间的联系并不是特别的紧密.在处理大规模数据方
面,没有行之有效的一般性方法;而对于大规模数据内在的生成机制也没有完全
明了,这使得生物信息学的研究短期内很难有突破性的结果.那么,要得到真正
的解决,最终不能从计算机科学得到,真正地解决可能还是得从生物学自身,从
数学上的新思路来获得本质性的动力.
毫无疑问,正如Dulbecco1986年所说:"人类的DNA序列是人类的真谛,
这个世界上发生的一切事情,都与这一序列息息相关".但要完全破译这一序列
以及相关的内容,我们还有相当长的路要走.
(来源 ------[InfoBio.org | 生物信息学研讨组])http://www.infobio.org
生物信息学(Bioinformatics)是在生命科学的研究中,以计算机为工具对生物信息进行储存、检索和分析的科学。它是当今生命科学和自然科学的重大前沿领域之一,同时也将是21世纪自然科学的核心领域之一。其研究重点主要体现在基因组学(Genomics)和蛋白学(Proteomics)两方面,具体说就是从核酸和蛋白质序列出发,分析序列中表达的结构功能的生物信息。
生物信息学是一门利用计算机技术研究生物系统之规律的学科。
目前的生物信息学基本上只是分子生物学与信息技术(尤其是因特网技术)的结合体。生物信息学的研究材料和结果就是各种各样的生物学数据,其研究工具是计算机,研究方法包括对生物学数据的搜索(收集和筛选)、处理(编辑、整理、管理和显示)及利用(计算、模拟)。
1990年代以来,伴随着各种基因组测序计划的展开和分子结构测定技术的突破和Internet的普及,数以百计的生物学数据库如雨后春笋般迅速出现和成长。对生物信息学工作者提出了严峻的挑战:数以亿计的ACGT序列中包涵着什么信息?基因组中的这些信息怎样控制有机体的发育?基因组本身又是怎样进化的?
生物信息学的另一个挑战是从蛋白质的氨基酸序列预测蛋白质结构。这个难题已困扰理论生物学家达半个多世纪,如今找到问题答案要求正变得日益迫切。诺贝尔奖获得者W. Gilbert在1991年曾经指出:“传统生物学解决问题的方式是实验的。现在,基于全部基因都将知晓,并以电子可操作的方式驻留在数据库中,新的生物学研究模式的出发点应是理论的。一个科学家将从理论推测出发,然后再回到实验中去,追踪或验证这些理论假设”。
生物信息学的主要研究方向: 基因组学 - 蛋白质组学 - 系统生物学 - 比较基因组学
姑且不去引用生物信息学冗长的定义,以通俗的语言阐述其核心应用即是:随着包括人类基因组计划在内的生物基因组测序工程的里程碑式的进展,由此产生的包括生物体生老病死的生物数据以前所未有的速度递增,目前已达到每14个月翻一番的速度。同时随着互联网的普及,数以百计的生物学数据库如雨后春笋般迅速出现和成长。然而这些仅仅是原始生物信息的获取,是生物信息学产业发展的初组阶段,这一阶段的生物信息学企业大都以出售生物数据库为生。以人类基因组测序而闻名的塞莱拉公司即是这一阶段的成功代表。
原始的生物信息资源挖掘出来后,生命科学工作者面临着严峻的挑战:数以亿计的ACGT序列中包涵着什么信息?基因组中的这些信息怎样控制有机体的发育?基因组本身又是怎样进化的?生物信息学产业的高级阶段体现于此,人类从此进入了以生物信息学为中心的后基因组时代。结合生物信息学的新药创新工程即是这一阶段的典型应用。
Ⅵ 拥塞算法
基于包丢失检测的 Reno、NewReno 或者 cubic 为代表,其主要问题有 Buffer bloat 和长肥管道两种。和这些算法不同,bbr 算法会以时间窗口内的最大带宽 max_bw 和最小 RTT min_rtt,并以此计算发送速率和拥塞窗口
RTProp : round-trip propagation time BtlBW : bottleneck bandwidth,bbr 算法关于拥塞窗口的核心就是计算 BtlBW 和 RTprop,根据这两者值计算 BDP
bbr 算法输出 pacing_rate 和 cwnd 两个数据。pacing_rate 决定发包速率,cwnd 为窗口大小
TCP Tahoe 和 Reno
这两个算法是根据其第一次加入到4.3BSD的时间回溯命名的,两个名字对应自其第一次出现时BSD的代号,而代号分别取自太浩湖(Lake Tahoe)和其附近的城市里诺市
• Tahoe:如果收到三次重复确认——即第四次收到相同确认号的分段确认,并且分段对应包无负载分段和无改变接收窗口——的话,Tahoe算法则进入快速重传,将慢启动阈值改为当前拥塞窗口的一半,将拥塞窗口降为1个MSS,并重新进入慢启动阶段
• Reno:如果收到三次重复确认,Reno算法则进入快速重传,只将拥塞窗口减半来跳过慢启动阶段,将慢启动阈值设为当前新的拥塞窗口值,进入一个称为“快速恢复”的新设计阶段
Fast recovery
是Reno算法新引入的一个阶段,在将丢失的分段重传后,启动一个超时定时器,并等待该丢失分段包的分段确认后,再进入拥塞控制阶段。如果仍然超时,则回到慢启动阶段
TCP Vegas
至1990年代中期,TCP量度延迟和RTT都是以传输缓存中最后一个被传送的分段包为准。vegas通过度量传输缓存中每个传送分段包来代替只量度一个分段包,通过每次度量的平均值来增加拥塞窗口。该算法取名自内华达州最大的城市拉斯维加斯。不过由于一些资源公平性原因,该算法并没有在彼得森的实验室之外广泛部署。一些研究认为该算法和其他拥塞算法混合使用,可能会导致性能竞争不及其他算法。在各种TCP拥塞算法的比较研究中,Vegas被认为是最平滑的控制算法,其次为CUBIC
TCP New Reno
TCP New Reno是对TCP Reno中快速恢复阶段的重传进行改善的一种改进算法,其定义于RFC 6582,覆盖了原有在RFC 3782和RFC 2582的旧定义。
在Reno的快速恢复中,一旦出现3次重复确认,TCP发送方会重发重复确认对应序列号的分段并设置定时器等待该重发分段包的分段确认包,当该分段确认包收到后,就立即退出快速恢复阶段,进入拥塞控制阶段,但如果某个导致重复确认的分段包到遇到重复确认期间所发送的分段包存在多个丢失的话,则这些丢失只能等待超时重发,并且导致拥塞窗口多次进入拥塞控制阶段而多次下降。而New Reno的快速恢复中,一旦出现3次重复确认,TCP发送方先记下3次重复确认时已发送但未确认的分段的最大序列号,然后重发重复确认对应序列号的分段包。如果只有该重复确认的分段丢失,则接收方接收该重发分段包后,会立即返回最大序列号的分段确认包,从而完成重发;但如果重复确认期间的发送包有多个丢失,接收方在接收该重发分段后,会返回非最大序列号的分段确认包,从而发送方继续保持重发这些丢失的分段,直到最大序列号的分段确认包的返回,才退出快速恢复阶段。
New Reno在低错误率时运行效率和“选择确认”(Selective ACKnowledgement,SACK)相当,在高错误率仍优于Reno
TCP Hybla
TCP Hybla旨在消除由于高延迟地面线路或者卫星无线链路下导致的RTT过长而对TCP链接的影响。它通过对拥塞窗口动态分析来修改,来减少对RTT的性能依赖
TCP BIC 和 CUBIC
TCP BIC(Binary Increase Congestion control)旨在优化高速高延迟网络(即根据RFC 1072所定义的“长肥网络”(long fat network,LFN))的拥塞控制,其拥塞窗口算法使用二分搜索算法尝试找到能长时间保持拥塞窗口最大值的值。Linux内核在2.6.8至2.6.18使用该算法作为默认TCP拥塞算法。
CUBIC则是比BIC更温和和系统化的分支版本,其使用三次函数代替二分算法作为其拥塞窗口算法,并且使用函数拐点作为拥塞窗口的设置值。Linux内核在2.6.19后使用该算法作为默认TCP拥塞算法
TCP Westwood和Westwood+
TCP Westwood改良自New Reno,不同于以往其他拥塞控制算法使用丢失来测量,其通过对确认包测量来确定一个“合适的发送速度”,并以此调整拥塞窗口和慢启动阈值。其改良了慢启动阶段算法为“敏捷探测(Agile Probing)”,和设计了一种持续探测拥塞窗口的方法来控制进入“敏捷探测”,使链接尽可能地使用更多的带宽。Westwood+使用更长的带宽估计间隔和优化的滤波器来修正Westwood对ACK压缩场景对带宽估计过高的问题。通过以上改良,TCP Westwood系列算法在有线网络和无线网络的拥塞控制上获取平衡,尤其研究中针对于无线通信网络上
Compound TCP
复合TCP(Compound TCP)是微软自己实现的TCP拥塞控制算法,通过同时维护两个拥塞窗口,来实现在长肥网络有较好的性能而又不损失公平性。该算法在Windows Vista和Windows Server 2008开始广泛部署,并通过补丁的方式回溯支持到Windows XP和Windows Server 2003。在Linux上也有一个旧版本的移植实现
TCP PRR
TCP PRR(TCP Proportional Rate Rection )是旨在恢复期间提高发送数据的准确性。该算法确保恢复后的拥塞窗口大小尽可能接近慢启动阈值。在Google进行的测试中,能将平均延迟降低3~10%,恢复的超时减少5%。PRR算法之后作为Linux内核3.2版本的默认拥塞算法
TCP BBR
TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由Google设计,于2016年发布的拥塞算法。以往大部分拥塞算法是基于丢包来作为降低传输速率的信号,而BBR则基于模型主动探测。该算法使用网络最近出站数据分组当时的最大带宽和往返时间来创建网络的显式模型。数据包传输的每个累积或选择性确认用于生成记录在数据包传输过程和确认返回期间的时间内所传送数据量的采样率。该算法认为随着网络接口控制器逐渐进入千兆速度时,与缓冲膨胀相关的延迟相比丢包更应该被认为是识别拥塞的主要决定因素,所以基于延迟模型的拥塞控制算法(如BBR)会有更高的吞吐量和更低的延迟,可以用BBR来替代其他流行的拥塞算法,例如CUBIC
QUIC Quick UDP Internet Connections
QUIC旨在提供几乎等同于TCP连接的可靠性,但延迟大大减少。它主要通过两个理解HTTP流量的行为来实现这一点:
第一个变化是在连接创建期间大大减少开销。由于大多数HTTP连接都需要TLS,因此QUIC使协商密钥和支持的协议成为初始握手过程的一部分。 当客户端打开连接时,服务器响应的数据包包括将来的数据包加密所需的数据。
QUIC使用UDP协议作为其基础,不包括丢失恢复。相反,每个QUIC流是单独控制的,并且在QUIC级别而不是UDP级别重传丢失的数据。这意味着如果在一个流中发生错误,协议栈仍然可以独立地继续为其他流提供服务
QUIC包括许多其他更普通的更改,这些更改也可以优化整体延迟和吞吐量
每个数据包是单独加密的,因此加密数据时不需要等待部分数据包。 在TCP下通常不可能这样做,其中加密记录在字节流中,并且协议栈不知道该流中的更高层边界。这些可以由运行在更上层的协议进行协商,但QUIC旨在通过单个握手过程完成这些
QUIC的另一个目标是提高网络切换期间的性能,例如当移动设备的用户从WiFi热点切换到移动网络时发生的情况。 当这发生在TCP上时,一个冗长的过程开始了:每个现有连接一个接一个地超时,然后根据需要重新创建。期间存在较高延迟,因为新连接需要等待旧连接超时后才会创建。 为解决此问题,QUIC包含一个连接标识符,该标识符唯一地标识客户端与服务器之间的连接,而无论源IP地址是什么。这样只需发送一个包含此ID的数据包即可重新创建连接,因为即使用户的IP地址发生变化,原始连接ID仍然有效
QUIC在应用程序空间中实现,而不是在操作系统内核中实现。当数据在应用程序之间移动时,这通常会由于上下文切换而调用额外的开销。 但是在QUIC下协议栈旨在由单个应用程序使用,每个应用程序使用QUIC在UDP上托管自己的连接
Chromium的网络堆栈同时打开QUIC和传统TCP连接,并在QUIC连接失败时以零延迟回退到TCP连接
Ⅶ Kmeans聚类算法简介(有点枯燥)
1. Kmeans聚类算法简介
由于具有出色的速度和良好的可扩展性,Kmeans聚类算法算得上是最着名的聚类方法。Kmeans算法是一个重复移动类中心点的过程,把类的中心点,也称重心(centroids),移动到其包含成员的平均位置,然后重新划分其内部成员。k是算法计算出的超参数,表示类的数量;Kmeans可以自动分配样本到不同的类,但是不能决定究竟要分几个类。k必须是一个比训练集样本数小的正整数。有时,类的数量是由问题内容指定的。例如,一个鞋厂有三种新款式,它想知道每种新款式都有哪些潜在客户,于是它调研客户,然后从数据里找出三类。也有一些问题没有指定聚类的数量,最优的聚类数量是不确定的。后面我将会详细介绍一些方法来估计最优聚类数量。
Kmeans的参数是类的重心位置和其内部观测值的位置。与广义线性模型和决策树类似,Kmeans参数的最优解也是以成本函数最小化为目标。Kmeans成本函数公式如下:
μiμi是第kk个类的重心位置。成本函数是各个类畸变程度(distortions)之和。每个类的畸变程度等于该类重心与其内部成员位置距离的平方和。若类内部的成员彼此间越紧凑则类的畸变程度越小,反之,若类内部的成员彼此间越分散则类的畸变程度越大。求解成本函数最小化的参数就是一个重复配置每个类包含的观测值,并不断移动类重心的过程。首先,类的重心是随机确定的位置。实际上,重心位置等于随机选择的观测值的位置。每次迭代的时候,Kmeans会把观测值分配到离它们最近的类,然后把重心移动到该类全部成员位置的平均值那里。
2. K值的确定
2.1 根据问题内容确定
这种方法就不多讲了,文章开篇就举了一个例子。
2.2 肘部法则
如果问题中没有指定kk的值,可以通过肘部法则这一技术来估计聚类数量。肘部法则会把不同kk值的成本函数值画出来。随着kk值的增大,平均畸变程度会减小;每个类包含的样本数会减少,于是样本离其重心会更近。但是,随着kk值继续增大,平均畸变程度的改善效果会不断减低。kk值增大过程中,畸变程度的改善效果下降幅度最大的位置对应的kk值就是肘部。为了让读者看的更加明白,下面让我们通过一张图用肘部法则来确定最佳的kk值。下图数据明显可分成两类:
从图中可以看出,k值从1到2时,平均畸变程度变化最大。超过2以后,平均畸变程度变化显着降低。因此最佳的k是2。
2.3 与层次聚类结合
经常会产生较好的聚类结果的一个有趣策略是,首先采用层次凝聚算法决定结果粗的数目,并找到一个初始聚类,然后用迭代重定位来改进该聚类。
2.4 稳定性方法
稳定性方法对一个数据集进行2次重采样产生2个数据子集,再用相同的聚类算法对2个数据子集进行聚类,产生2个具有kk个聚类的聚类结果,计算2个聚类结果的相似度的分布情况。2个聚类结果具有高的相似度说明kk个聚类反映了稳定的聚类结构,其相似度可以用来估计聚类个数。采用次方法试探多个kk,找到合适的k值。
2.5 系统演化方法
系统演化方法将一个数据集视为伪热力学系统,当数据集被划分为kk个聚类时称系统处于状态kk。系统由初始状态k=1k=1出发,经过分裂过程和合并过程,系统将演化到它的稳定平衡状态 kiki ,其所对应的聚类结构决定了最优类数 kiki 。系统演化方法能提供关于所有聚类之间的相对边界距离或可分程度,它适用于明显分离的聚类结构和轻微重叠的聚类结构。
2.6 使用canopy算法进行初始划分
基于Canopy Method的聚类算法将聚类过程分为两个阶段
(1) 聚类最耗费计算的地方是计算对象相似性的时候,Canopy Method在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy,通过一系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况,可以把这一阶段看做数据预处理;
(2) 在各个Canopy内使用传统的聚类方法(如Kmeans),不属于同一Canopy的对象之间不进行相似性计算。
从这个方法起码可以看出两点好处:首先,Canopy不要太大且Canopy之间重叠的不要太多的话会大大减少后续需要计算相似性的对象的个数;其次,类似于Kmeans这样的聚类方法是需要人为指出K的值的,通过(1)得到的Canopy个数完全可以作为这个k值,一定程度上减少了选择k的盲目性。
其他方法如贝叶斯信息准则方法(BIC)可参看文献[4]。
3. 初始质心的选取
选择适当的初始质心是基本kmeans算法的关键步骤。常见的方法是随机的选取初始中心,但是这样簇的质量常常很差。处理选取初始质心问题的一种常用技术是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数。
第二种有效的方法是,取一个样本,并使用层次聚类技术对它聚类。从层次聚类中提取kk个簇,并用这些簇的质心作为初始质心。该方法通常很有效,但仅对下列情况有效:(1)样本相对较小,例如数百到数千(层次聚类开销较大);(2) kk相对于样本大小较小。
第三种选择初始质心的方法,随机地选择第一个点,或取所有点的质心作为第一个点。然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。此外,求离当前初始质心集最远的点开销也非常大。为了克服这个问题,通常该方法用于点样本。由于离群点很少(多了就不是离群点了),它们多半不会在随机样本中出现。计算量也大幅减少。
第四种方法就是上面提到的canopy算法。
4. 距离的度量
常用的距离度量方法包括:欧几里得距离和余弦相似度。两者都是评定个体间差异的大小的。
欧氏距离是最常见的距离度量,而余弦相似度则是最常见的相似度度量,很多的距离度量和相似度度量都是基于这两者的变形和衍生,所以下面重点比较下两者在衡量个体差异时实现方式和应用环境上的区别。
借助三维坐标系来看下欧氏距离和余弦相似度的区别:
从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。
根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。
因为欧几里得距离度量会受指标不同单位刻度的影响,所以一般需要先进行标准化,同时距离越大,个体间差异越大;空间向量余弦夹角的相似度度量不会受指标刻度的影响,余弦值落于区间[-1,1],值越大,差异越小。但是针对具体应用,什么情况下使用欧氏距离,什么情况下使用余弦相似度?
从几何意义上来说,n维向量空间的一条线段作为底边和原点组成的三角形,其顶角大小是不确定的。也就是说对于两条空间向量,即使两点距离一定,他们的夹角余弦值也可以随意变化。感性的认识,当两用户评分趋势一致时,但是评分值差距很大,余弦相似度倾向给出更优解。举个极端的例子,两用户只对两件商品评分,向量分别为(3,3)和(5,5),这两位用户的认知其实是一样的,但是欧式距离给出的解显然没有余弦值合理。
5. 聚类效果评估
我们把机器学习定义为对系统的设计和学习,通过对经验数据的学习,将任务效果的不断改善作为一个度量标准。Kmeans是一种非监督学习,没有标签和其他信息来比较聚类结果。但是,我们还是有一些指标可以评估算法的性能。我们已经介绍过类的畸变程度的度量方法。本节为将介绍另一种聚类算法效果评估方法称为轮廓系数(Silhouette Coefficient)。轮廓系数是类的密集与分散程度的评价指标。它会随着类的规模增大而增大。彼此相距很远,本身很密集的类,其轮廓系数较大,彼此集中,本身很大的类,其轮廓系数较小。轮廓系数是通过所有样本计算出来的,计算每个样本分数的均值,计算公式如下:
aa是每一个类中样本彼此距离的均值,bb是一个类中样本与其最近的那个类的所有样本的距离的均值。
6. Kmeans算法流程
输入:聚类个数k,数据集XmxnXmxn。
输出:满足方差最小标准的k个聚类。
(1) 选择k个初始中心点,例如c[0]=X[0] , … , c[k-1]=X[k-1];
(2) 对于X[0]….X[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i;
(3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的样本的每个特征的均值};
(4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值或者达到最大迭代次数。
Kmeans的时间复杂度:O(tkmn),空间复杂度:O((m+k)n)。其中,t为迭代次数,k为簇的数目,m为样本数,n为特征数。
7. Kmeans算法优缺点
7.1 优点
(1). 算法原理简单。需要调节的超参数就是一个k。
(2). 由具有出色的速度和良好的可扩展性。
7.2 缺点
(1). 在 Kmeans 算法中 kk 需要事先确定,这个 kk 值的选定有时候是比较难确定。
(2). 在 Kmeans 算法中,首先需要初始k个聚类中心,然后以此来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果。多设置一些不同的初值,对比最后的运算结果,一直到结果趋于稳定结束。
(3). 该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。
(4). 对离群点很敏感。
(5). 从数据表示角度来说,在 Kmeans 中,我们用单个点来对 cluster 进行建模,这实际上是一种最简化的数据建模形式。这种用点来对 cluster 进行建模实际上就已经假设了各 cluster的数据是呈圆形(或者高维球形)或者方形等分布的。不能发现非凸形状的簇。但在实际生活中,很少能有这种情况。所以在 GMM 中,使用了一种更加一般的数据表示,也就是高斯分布。
(6). 从数据先验的角度来说,在 Kmeans 中,我们假设各个 cluster 的先验概率是一样的,但是各个 cluster 的数据量可能是不均匀的。举个例子,cluster A 中包含了10000个样本,cluster B 中只包含了100个。那么对于一个新的样本,在不考虑其与A cluster、 B cluster 相似度的情况,其属于 cluster A 的概率肯定是要大于 cluster B的。
(7). 在 Kmeans 中,通常采用欧氏距离来衡量样本与各个 cluster 的相似度。这种距离实际上假设了数据的各个维度对于相似度的衡量作用是一样的。但在 GMM 中,相似度的衡量使用的是后验概率 αcG(x|μc,∑c)αcG(x|μc,∑c) ,通过引入协方差矩阵,我们就可以对各维度数据的不同重要性进行建模。
(8). 在 Kmeans 中,各个样本点只属于与其相似度最高的那个 cluster ,这实际上是一种 hard clustering 。
针对Kmeans算法的缺点,很多前辈提出了一些改进的算法。例如 K-modes 算法,实现对离散数据的快速聚类,保留了Kmeans算法的效率同时将Kmeans的应用范围扩大到离散数据。还有K-Prototype算法,可以对离散与数值属性两种混合的数据进行聚类,在K-prototype中定义了一个对数值与离散属性都计算的相异性度量标准。当然还有其它的一些算法,这里我 就不一一列举了。
Kmeans 与 GMM 更像是一种 top-down 的思想,它们首先要解决的问题是,确定 cluster 数量,也就是 k 的取值。在确定了 k 后,再来进行数据的聚类。而 hierarchical clustering 则是一种 bottom-up 的形式,先有数据,然后通过不断选取最相似的数据进行聚类。
Ⅷ x-means算法原理是什么
你好!
原理是对给定范围内的K值,反复调用K-means,从最低K值开始,每次聚类完成后计算其BIC得分,再把得到的每个类调用K-means划分为两个孩子类,并计算孩子类BIC得分,如果父类和孩子类的BIC得分差别很大则划分开,或者选择差别最大的划分开,于是K=K+1,再调用K-means,新的类心为上一次得到的(K-1)个类心,和划分开的两个子类类心,重复此过程。当K=Kmax后,返回最佳的聚类就行了
仅代表个人观点,不喜勿喷,谢谢。