我有一个2d阵列(x,y)的点,我想绘制一个包含80%这个点的圆,我也想知道结果圆的半径。用python有什么办法吗?
我一直在寻找一种方法,但没有成功。我道歉没有尝试,但我完全失去了80%而没有给圆圈半径的条件。
更新
我尝试了以下内容:
import matplotlib.pyplot as plt
x=[1, 1.15, 1.23, 0.92, 1.31, 1.18, 1.27, 1.07, 3, 3.2]
y=[1.17, 0.95, 1.04, 1.32, 1, 1.22, 1.28, 0.99, 1, 1.2]
plt.plot(x, y, 'bo')
circle=plt.Circle((1.1, 1.12), 0.2, color='g', fill=False)
fig = plt.gcf()
fig.gca().add_artist(circle)
plt.axis([0, 3.5, 0, 3.5])
plt.show()
这是我想要获得的情节:
在这个例子中我有10个点,圆圈是最小的圆圈,里面有8个点。我用眼睛做了这个例子,但我想要的是:给定x和y,得到圆的参数(中心位置和半径),这些参数匹配至少80%的点在其中的条件,即,如何成为包含至少80%积分的最小圆圈。这可能吗?
答案 0 :(得分:5)
正如其他人所说,你可以绘制许多不同的圆圈来获得所要求的结果。但是,这样做的一种快速而肮脏的方法可能是:
import numpy as np
import matplotlib.pyplot as plt
# generate some random points
n = 1000
x = 4 * np.random.randn(n) + 15
y = 2 * np.random.randn(n) + 10
# somehow compute center of cloud, use e.g. medium or mean
x0 = np.median(x)
y0 = np.median(y)
# compute radius
r = np.sqrt((x - x0)**2 + (y - y0)**2)
t = 80 # percent
r0 = np.percentile(r, t)
n_within = (r < r0).sum()
# make plot
plt.plot(x, y, '.')
circle = plt.Circle((x0, y0), r0, color='r', fill=False)
plt.gca().add_artist(circle)
plt.title('Found center at ({:.2f}, {:.2f})\n'
'{}% radius is {:.2f}\n'
'{} / {} points within circle'.format(
x0, y0, t, r0, n_within, n))
plt.axis([0, 30, 0, 20])
plt.show()
结果:
答案 1 :(得分:1)
你问的算法问题多于python问题。而且我会说这个提案是最优的FAR,但它可能会帮助你开始正确的道路。
您可以考虑随机搜索。选择一个随机点并绘制一些随机半径的圆圈,该点位于中心。计算圆圈中的点数并选择最佳点。
您选择了多少个点,您绘制了多少个圆以及半径取决于您。你尝试的越多,你就越有可能在没有超越的情况下接近你的80%。如果没有一些初步的数据探索,你应该尝试什么价值我不能推荐。你尝试的越多,它的计算成本就会越高。这一切都取决于尽可能接近80%的数字是多么重要。
答案 2 :(得分:1)
因为您只是想要删除外围点,这应该可行,但可能会使用不寻常的数据做奇怪的事情
快速正脏:
替代: