咱好好琢磨琢磨啥叫"到直線距離的最大值最小化",為方便書寫簡寫為A。首先,假如你只有兩個點,符合A的直線就是過這兩個點的直線。如果你的點很多,構成了一個橢圓,這條直線應該就在長軸附近。如果資料的形狀分佈在橢圓的邊沿上,也就是說橢圓中間沒有點,情況不變。然後我們發現,如果任意畫一條直線,任意一點到這個直線的距離,在把點和這條直線投影到一個和直線垂直的任意新直線上後,點的投影和直線投影(現在已經變成一個點了)距離不變。並且最靠兩邊的點一定是原資料凸包上的點。因此題主需要找的直線要這麼找:
咱好好琢磨琢磨啥叫"到直線距離的最大值最小化",為方便書寫簡寫為A。首先,假如你只有兩個點,符合A的直線就是過這兩個點的直線。如果你的點很多,構成了一個橢圓,這條直線應該就在長軸附近。如果資料的形狀分佈在橢圓的邊沿上,也就是說橢圓中間沒有點,情況不變。然後我們發現,如果任意畫一條直線,任意一點到這個直線的距離,在把點和這條直線投影到一個和直線垂直的任意新直線上後,點的投影和直線投影(現在已經變成一個點了)距離不變。並且最靠兩邊的點一定是原資料凸包上的點。因此題主需要找的直線要這麼找:
把資料投影在一條直線上,計算投影點的最大值和最小值,計算差值,這個差值就是資料在這條直線上的散開度。找到散開度最小的那條直線,和投影點最大值和最小值的均值。過均值,垂直於投影直線的直線就是所求直線。下面的問題是如何透過計算來實現這一過程,即:如何找到散點投影最緊密的方向,步驟如下:找到最外圈的點,也就是點集的凸包,假設這些點有m個。只有這些點才對結果有影響,中間的點都沒用。把凸包中的m個點投影到許多角度不同的的直線上,選擇投影散開範圍最小的那條直線,過最大點和最小點的中心做一條垂直直線,就是所求直線。這裡的變數只有一個,就是投影直線的斜率,因此是一個一維搜尋問題。當點集的形狀呈近似橢圓形時,投影直線應該在橢圓的短軸方向附近,在那個方向找一個初值,然後在附近搜尋即可。這條最優直線不一定恰好過點集中的點,比如長方形四個頂點構成的點集,所求直線是不過任何點的。這條最優直線也不一定垂直於點集中的任何一條邊,比如現在有10^10個點雜湊在y軸上,y軸左方和右方還各有一個點,這兩個點到y軸距離相等,但是y座標不相等,y軸上也恰好沒有點和它倆的y座標相等。那麼顯然最優直線就是y軸,但是整個點集中10^10+2個點沒有兩個的連線和y軸垂直。因此我覺得這個問題需要透過數值方法找到最優解。