思考 從曲線中提取出近似直線的一段

2022-02-06 20:54:05 字數 1941 閱讀 8579

這個問題也是別人問我的, 我思考了一些時間, 希望拋磚引玉, 得到更好的方法.

問題是這樣的: 有一些離散的點, 在座標系中把它們擬合成一條曲線, 其中有一段看上去很像是直線, 現在要求出這段"直線"的起始座標和結束座標, 並把這條線的方程求出來. 如下圖:

從圖中可以用肉眼看出標註的那一段近似一條直線, 問題是如果通過程式求出來.

我的想法是這樣的, 假設這條線是存在的, 那麼這條線裡的點, 它們相鄰兩兩之間y之差應該是"相似"的, 具體相似要什麼程度, 需要有乙個"允許誤差值". 在這個允許誤差值下, 盡可能多的把這條曲線上連續的點拉攏到一條直線上, 最後根據這些點用最小二乘法就可以求得直線方程了.

獲取這些連續的點:

static 

list

getsequential(list

points, double allowlapse)

}resultlist.add(currentresult);

//從集合中選出點的數量最多的那組資料

list

result = resultlist.orderbydescending(list => list.count).first();

return result;

}

point類的定義, 很簡單:

internal class 

point

public double y

public point(double x, double y)

}

根據一些點, 用最小二乘法求出直線:

static void leastsquare(list

points)

+ x\nstart (, )\tend (, )\npoints count: ", x0, k, points.first().x, points.first().y, points.last().x, points.last().y, points.count);

}

允許y差值

方程起點

終點包含點數

0.005

y=0.27 + 0.45x

(0.13, 0.328201)

(0.15, 0.337173)

30.010

y=0.25 + 0.60x

(0.12, 0.318606)

(0.17, 0.350823)

60.015

y=0.48 + 1.08x

(0.54, 1.060612)

(0.77, 1.318348)

240.020

y=0.23 + 1.46x

(0.28, 0.611221)

(0.77, 1.318348)

500.025

y=0.22 + 1.48x

(0.26, 0.56426)

(0.77, 1.318348)

520.030

y=0.13 + 1.64x

(0.09, 0.255596)

(0.77, 1.318348)

690.035

y=0.13 + 1.64x

(0.08, 0.222174)

(0.77, 1.318348)

700.040

y=0.12 + 1.65x

(0.07, 0.183729)

(0.77, 1.318348)

71對比文中開頭的插圖, 可以看出"允許y差值"在0.020和0.025, 得到的資料還是比較靠譜的. 但這樣的做法還有一點問題, 如果每個點都比前乙個點高一點(在允許y差值範圍內), 等到點積累多了, 從整體看, 這些點組成的線就是一條向上的拋物線了, 那麼這個演算法就存在問題.

思考 從曲線中提取出近似直線的一段

這個問題也是別人問我的,我思考了一些時間,希望拋磚引玉,得到更好的方法.問題是這樣的 有一些離散的點,在座標系中把它們擬合成一條曲線,其中有一段看上去很像是直線,現在要求出這段 直線 的起始座標和結束座標,並把這條線的方程求出來.如下圖 從圖中可以用肉眼看出標註的那一段近似一條直線,問題是如果通過程...

如何從威脅資料當中提取出威脅情報

威脅情報供給能力已經成為各類組織機構內網路安全體系的重要組成部分。目前已經有多家安全方案 商針對最新惡意軟體手段 惡意網域名稱 ip位址以及基於主機的違規指標 簡稱ioc 提供與安全威脅相關的情報反饋。而這些威脅反饋方案的本質思路可謂大同小異。惡意人士的行動速度正變得越來越快,而強大的情報 能力則將...

從檔案中提取數字

程式的功能是從指定的檔案中提取所有的整數,並把它們依次存入到乙個字串中 void iostest char a 50 char b 50 istrstream sin a ostrstream sout b,sizeof b ifstream file1 w1.dat ios in ios nocr...