Python 分段最小二乘算法,don';我根本不理解动态规划的概念

Python 分段最小二乘算法,don';我根本不理解动态规划的概念,python,algorithm,implementation,Python,Algorithm,Implementation,我已经尝试用Python实现这个算法好几天了。我不断地回到过去,只是放弃了,变得沮丧。我不知道发生了什么事。我没有任何人需要帮助,也没有任何地方需要帮助,所以我来到这里 PDF警告: 我不认为这是一个明确的解释,我当然不明白 我对正在发生的事情的理解是: 我们有一组点(x1,y1),(x2,y2)。。我们想找到一些最适合这些数据的线。我们可以有多条直线,这些直线来自给定的a和b论坛(y=ax+b) 现在,该算法从端点(?)开始,并假设点p(x_i,y_i)是线段的一部分。然后注释说,最优解是,'

我已经尝试用Python实现这个算法好几天了。我不断地回到过去,只是放弃了,变得沮丧。我不知道发生了什么事。我没有任何人需要帮助,也没有任何地方需要帮助,所以我来到这里

PDF警告:

我不认为这是一个明确的解释,我当然不明白

我对正在发生的事情的理解是:

我们有一组点(x1,y1),(x2,y2)。。我们想找到一些最适合这些数据的线。我们可以有多条直线,这些直线来自给定的a和b论坛(y=ax+b)

现在,该算法从端点(?)开始,并假设点p(x_i,y_i)是线段的一部分。然后注释说,最优解是,'是{p1,…,pi的最优解−1} 通过{pi,…pn}的加号(最佳)线。这对我来说意味着,我们去点p(x_i,y_i),然后往回走,找到通过其余点的另一条线段。现在,最佳解决方案是这两条线段

然后它进行了一个我无法理解的逻辑跳跃,并说“假设最后一个点pn是从p_I开始的段的一部分。如果Opt(j)表示第一个j点的成本,e(j,k)表示 通过点j到k的最佳直线的误差,然后Opt(n)=e(i,n)+C+Opt(i− 1) "

然后是算法的伪代码,我不明白。我知道我们想要遍历点列表,找到使OPT(n)公式最小化的点,但我不遵循它。这让我觉得自己很愚蠢

我知道这个问题让人头疼,回答起来也不容易,但我只是想了解一下这个算法。我为PDF文件道歉,但我没有一种更简洁的方式向读者提供关键信息


感谢您的时间和阅读,我很感激。

动态规划的基本前提是递归地优化(降低“成本”或在本例中,错误)问题,同时存储子问题的成本,这样它们就不会被重新计算(这称为记忆)

现在有点晚了,所以我不想说得太详细了,但看起来你最有问题的部分是核心DP本身。由于“分段”质量,此处需要DP。正如您的PDF所示,通过最小二乘法找到最佳拟合线非常简单,不需要DP

Opt(n)-e(i,n)+C+Opt(i-1)---我们的成本函数,其中
C是新线段的恒定成本(没有它,问题很简单,我们只需为每两点制作新线段)
e(i,n)是点i到n与一段的误差(非递归)
Opt(i-1)是从第一点到第(i-1)点的递归最小代价

现在是算法

确保点列表按x值排序
M[0]=0——不言自明
对于i 对于(j=1..n): M[j]=min([Opt(j)表示范围(1,j)内的i)]

因此,基本上,找到任意两个可能点之间的单线成本,存储在e
找到j的最小成本,对于介于1和n之间的j。沿途的值将有助于以后的计算,因此请存储它们!注意,i也是一个要选择的参数。 M[n]是总优化成本

你们的问题-你们如何确定分段发生的位置?你们如何使用这个和M来确定一组线段,一旦它全部结束


希望这能有所帮助!

棘手的部分,动态编程部分,就是这一部分

for j = 1 to n
    M[j] = min_(1=<i=<j) ( e(i,j) + C + M[i-1])
j=1到n的


M[j]=min_1(1=从点1开始,直到点j为止的最佳解决方案必须在最后一条线段中包含新的端点j,因此问题变成了我必须在哪里放置最后一个分割以最小化最后一条线段的成本

幸运的是,成本是根据您试图解决的同一问题的子问题计算的,幸运的是,当您移动到下一个点j时,您已经解决了这些较小的子问题。因此,在新的点j处,您试图在点1和点j之间找到一个最佳点i,以分割出一条新线段,该线段包括des j,并最小化成本:最优成本(i)+分割成本(i)+lsq拟合成本(i+1,j)。现在令人困惑的是,在任何一点上,你可能看起来只是找到了一个单一的分割,但实际上所有之前的分割都是由最优成本(i)决定的,既然你已经计算了所有这些点到j的最佳成本,那么你只需要记住答案,这样算法就不必在每次提高一个点时重新计算这些成本

在python中,我可能会使用字典来存储结果,尽管对于这种动态编程算法,数组可能更好

无论如何

    def optimalSolution(points,split_cost)
        solutions = {0:{'cost':0,'splits':[]}}
        for j in range(1,len(points)):
            best_split = None
            best_cost = lsqFitCost(points,0,j)
            for i in range(0,j):
                cost = solutions[i]['cost'] + split_cost + lsqFitCost(points,i+1,j)
                if cost < best_cost:
                   best_cost = cost
                   best_split = i
            if best_split != None:
                solution[j] = {'cost':best_cost,'splits':solution[best_split]['splits']+[best_split]}
            else:
                solution[j] = {'cost':best_cost,'splits':[]}
        return solutions
def最优解决方案(积分、分摊成本)
解决方案={0:{'cost':0,'splits':[]}
对于范围(1,len(点))内的j:
最佳分割=无
最佳成本=lsqFitCost(点,0,j)
对于范围(0,j)内的i:
成本=解决方案[i]['cost']+拆分成本+lsqFitCost(点数,i+1,j)
如果成本<最佳成本:
最佳成本=成本
最佳分割=i
如果最佳分割!=无:
解决方案[j]={'cost':最佳成本,'splits':解决方案[best_split]['splits']+[best_split]}
其他:
解决方案[j]={'cost':最佳成本,'splits':[]
返回解决方案
这并不漂亮,我也没有检查过(可能会有一个错误,在这种情况下,没有拆分是最好的成本),但希望它能帮助您走上正确的道路?注意