2015-06-06 141 views
2

我正在用matplotlib繪製圖形上一組點的橢圓。我想獲得這樣的事情:在點周圍繪製橢圓

enter image description here

一種用於組(紅色爲例)數據集可能看起來像這樣:

[[-23.88315146 -3.26328266] # first point 
[-25.94906669 -1.47440904] # second point 
[-26.52423229 -4.84947907]] # third point 

我可以很容易地畫上一個點圖,但我遇到問題繪製橢圓。

橢圓的直徑爲2 * standard deviation,其中心的座標爲(x_mean, y_mean)。一個橢圓的寬度等於x standard deviation * 2。它的高度等於y standard deviation * 2

但是,我不知道如何計算橢圓的角度(你可以在圖片上看到橢圓不是完美的垂直)。

你有關於如何做到這一點的想法?

說明: 這個問題是LDA問題(線性判別分析)的簡化。我試圖將問題簡化爲最基本的表達。

回答

0

這有很多做與數學不是編程;)

既然你已經擁有的尺寸和僅想找到的角度,這裏是我會做什麼(根據我的直覺):

嘗試找到最適合給定的一組點(趨勢線)的線,這也稱爲Linear Regression。有幾種方法可以做到這一點,但最簡單的方法是一個相對容易的方法(見下文)。

一旦找到最合適的線條,您可以使用斜率作爲角度。

最小二乘線性迴歸

最小二乘線性迴歸的方法來找到趨勢線的斜率,這正是我們想要的。

這裏是一個video explaining how it works

讓我們假設你有一個數據集:data = [(x1, y1), (x2, y2), ...]

使用最小二乘法,你的斜率是:

# I see in your example that you already have x_mean and y_mean 
# No need to calculate them again, skip the two following lines 
# and use your values in the rest of the example 
avg_x = sum(element[0] for element in data)/len(data) 
avg_y = sum(element[1] for element in data)/len(data) 

x_diff = [element[0] - avg_x for element in data] 
y_diff = [element[1] - avg_y for element in data] 

x_diff_squared = [element**2 for element in x_diff] 

slope = sum(x * y for x,y in zip(x_diff, y_diff))/sum(x_diff_squared) 

一旦你的,你是幾乎完成。斜率等於角度的正切值slope = tan(angle)

使用python的math模塊angle = math.atan(slope)這將返回以弧度表示的角度。如果你想在度你有使用math.degrees(angle)

與尺寸和你已經有了位置結合這將其轉換和你有你自己的橢圓形;)


這是我會怎麼解決這個特殊問題,但可能有一千種不同的方法可能會起作用 並且最終可能比我提出的更好(也更復雜)。

-1

這是一個深入研究的問題。首先請您想要包含的點集 中的convex hull。然後執行文獻中描述的計算。 我在下面提供了兩個來源。

「最小的包圍橢圓 - C++中的精確和通用實現」(abstract link)。


          Ellipse


查爾斯·F·凡·隆。 「使用橢圓擬合和封裝數據點」。 (PDF download)。