确定哪个点的子集最接近多项式

2024-05-29 04:19:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正试图根据河流的行为对它们进行分类。许多河流的行为与二次多项式非常相似。你知道吗

enter image description here

然而,一些河流的某些区域偏离了这种模式。 enter image description hereenter image description here

我想通过计算所有点离简单多项式的距离来分类。基本上看起来是这样的:

enter image description here

但要做到这一点,我必须只计算那些“正常行为”点的多项式。否则,我的多项式被转移到发散行为的方向,我无法正确计算距离。你知道吗

enter image description hereenter image description here

下面是一些示例数据。你知道吗

x_test = [-150,-140,-130,-120,-110,-100,-90,-80,-70,-60,-50,-40,-30,-20,-10,0,10,20,30,40,50,60,70,70,80,80,90,90,100,100]
y_test = [0.1,0.11,0.2,0.25,0.25,0.4,0.5,0.4,0.45,0.6,0.5,0.5,0.6,0.6,0.7, 0.7,0.65,0.8,0.85,0.8,1,1,1.2,0.8,1.4,0.75,1.4,0.7,2,0.5]

我可以用numpy创建一个多项式。你知道吗

fit = np.polyfit(x_test, y_test, deg=2, full=True)
polynom = np.poly1d(fit[0]) 
simulated_data = polynom(x)

当我绘制它时,我得到如下结果:

ax = plt.gca()
ax.scatter(x_test,y_test)
ax.plot(x, simulated_data)

enter image description here

如您所见,多项式稍微向下移动,这是由此处标记为黑色的点引起的:

enter image description here

有没有一个简单的方法来找到那些不遵循主流的点,并排除它们来创建多项式?你知道吗


Tags: test区域距离datanp模式分类ax
2条回答

一种可行的方法是将点分为“主”分支和“分支”分支,假设有两个分支,其中一个分支包含的点多于另一个分支。之后,每个聚类可以用来拟合一个多项式,该多项式在河流支流汇合处交叉。这甚至可以通过使用多项式来进行多次迭代,从而通过使用点到多项式的距离作为距离度量而不是聚类算法所使用的距离度量来获得更好的聚类分类。你知道吗

常见的k-means算法可能不太适合,因为聚类不是围绕点而是围绕曲线。像DBSCAN这样的算法可能工作得更好,因为它们计算了给定点附近的点的密度,这与我们人类看到上述示例数据集中的模式时所做的更为相似。你知道吗

可能如下所示(无效代码):

points = (x_test, y_test)
labels = dbscan(points, k=2, labels=("main", "offshoot"))
polynomial_main = fit_polynomial([points[x.index] for x in labels if x.label = "main"])
polynomial_off = fit_polynomial([points[x.index] for x in labels if x.label = "offshoot"])

# optionally, purely distance based clustering
# might also use different clustering algorithm using distance as measure
points_main = [p for p in points if distance(p, polynomial_main) < distance(p, polynomial_off)]
points_off = [p for p in points if distance(p, polynomial_off) < distance(p, polynomial_main)]
polynomial_main = fit_polynomial(points_main)
polynomial_off = fit_polynomial(points_off)

这看起来更像是一个人工智能问题,而不是一个简单的拟合问题:你个人如何决定什么不适合-特别是在你的第二个发散图中,如果忽略较大的曲线,第一个向上的短曲线看起来是多项式?你知道吗

你只需要3个点来计算一个2-多项式:计算3个水平间距很好的点(不一定信任第一个点或最后一个点)的所有/多个采样的曲线,看看哪个点产生的异常值最少-比其他点的90%远的点?你知道吗

然后,您可以基于剩余的非异常点计算曲线,并检查它是否符合您的普通计算曲线。你知道吗

编辑:“间隔良好”的意思是每三分之一的水平点各有一个点——用三个点挤在一起来推断其他点是没有意义的。另外,从您提供的数据的外观来看,您需要一条从原点开始向上的曲线,因此您可以过滤一些随机生成的曲线。你知道吗

编辑:离群值的建议是草率的-如果你的数据在最后变得更广泛,像一个喇叭,你有一些似是而非的拟合,所以只有在它有明显的刺激,你可以有一个明确的标记离群值。如果计算点与每条随机曲线距离的直方图,则可以扫描直方图切线中的肩部和不对称性,以使其远离钟形曲线,并在该点处切片以查找异常值。你知道吗

从根本上说,我认为数据可能太复杂了,无法进行计算机辅助分析,除非你突破计算机视觉技术:让计算机尽其所能,然后目视检查带注释的图表,看你是否同意。你知道吗

它也可能有助于绘制垂直轴的对数,所以你要处理的是直线。你知道吗

相关问题 更多 >

    热门问题