說明
L1算法中的核心公式簡明易懂,但是從核心的優(yōu)化式向復(fù)雜的迭代式的推導(dǎo)卻不是那么簡單磕仅。本文將針對相關(guān)公式進(jìn)行一次推導(dǎo)荐吉,最后根據(jù)驗證的迭代式進(jìn)行代碼實現(xiàn)。
公式推導(dǎo)
L1核心公式如下:
(1)中 代表sample point集合和單個點炬藤,
代表原本的點云點集和單個點御铃,
代表
對應(yīng)的平衡常數(shù)(balancing constants),
代表
的有向度(directionality degree)沈矿。
將看做函數(shù)中的變量上真,則有以下式子
偏微分:
偏微分:
由于式(1.2)和(1.3)中的系數(shù) 和
在實際運算中近似為1和-1,所以系數(shù)可以直接去掉细睡,直接保留符號即可谷羞。
最終去掉系數(shù)的化簡式如下:
P.S. 原論文,但是按照(1.3)計算
溜徙,此處采用的是3次方的這個定義。
化簡式又可以提取為:
根據(jù)新的斥力系數(shù)定義(刊誤:原論文里使用公式為
犀填,經(jīng)分析
應(yīng)為筆誤)蠢壹,可將(2.2)化簡為:
簡單移項后可得:
使用不動點迭代[1]推導(dǎo)出迭代公式:
可以看到,(3.1)和迭代公式(4)已經(jīng)基本一毛一樣了九巡。
代碼實現(xiàn)
整個迭代的流程包括:
- 計算鄰居(self neighbor 和origin neighbor)
- 計算
項(computeAlphasTerms)和
項(computeBetasTerms)
- 根據(jù)
和
計算新的迭代坐標(biāo)(公式4)
- 重復(fù)上述步驟直到滿足停止條件
迭代函數(shù)
double L1median::iterateReturnError()
{
/*位置迭代更新*/
paraPtr->add("neighborhood_size", h);
for (int i = 0; i < sampleInfo.size(); ++i) {
sampleInfo[i].kind = (sampleInfo[i].kind == pi::Candidate) ? pi::Sample : sampleInfo[i].kind;
}
computeAlphasTerms();
computeBetasTerms();
double error = updateSamplePos();
emit infoSignal("RMS:" + QString::number(error, 'f', 6)+'\n');
/*位置同步*/
if (synSampleWithInfo()) {
emit iterateSignal();
} else {
emit errorSignal(QString("fail to synchronize sample info"));
return 0.0;
}
/*位置更新后的預(yù)備信息計算*/
computeNeighbors();
computeSigmas();
return error;
}
其它具體實現(xiàn)部分過于復(fù)雜图贸,此處按下不表,有時間可能另開一章進(jìn)行說明冕广。