回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我最近一直在解决一个问题。这项任务似乎很容易解释,但为我编写代码却很复杂。我试过很多变体,但都缺少一些。不知道是什么。需要有人对外面有发言权,因为我的思维方式太深了,有时也注意不到简单的东西</p>
<p>我会尽量简化这个问题,使它更容易理解。你知道吗</p>
<p>所以我们有一个包含对象的列表</p>
<pre><code>lst = [A0, A1, A2, A3, A4]
</code></pre>
<p>我需要做的是,运行一个名为<code>predict()</code>的方法,然后从<code>lst</code>中的每个元素,得到预测的元素<code>Ap</code>。这个方法必须运行3次,所以对于<code>A0</code>,我将得到<code>Ap1</code>,<code>Ap2</code>,<code>Ap3</code>。但是,<code>predict()</code>执行的计算依赖于列表的前一个元素以及它提供的结果。因此<code>Ap1</code>只从<code>A0</code>计算,而<code>Ap2</code>是从<code>A0</code>和<code>Ap1</code>(作为输入传递给<code>predict()</code>,而<code>Ap3</code>是从<code>A0, Ap1, Ap2</code>计算的。所有这些计算都是在<code>A0</code>下完成的。当考虑到<code>lst</code>的每个后续元素时,随着初始输入长度的增长,计算变得更加复杂。你知道吗</p>
<p>下面的“流程图”可能会有所帮助。你知道吗</p>
<p>=====================================================================</p>
<p>1)病例<code>A0</code></p>
<p><code>A0</code>--->;<code>predict([A0])</code>--->;<code>Ap1</code></p>
<p><code>A0, Ap1</code>--->;<code>predict([A0,Ap1])</code>--->;<code>Ap2</code></p>
<p><code>A0, Ap1, Ap2</code>--->;<code>predict([A0,Ap1,Ap2])</code>--->;<code>Ap3</code></p>
<p>=====================================================================</p>
<p>2)case<code>A1</code>-也考虑初始输入的前一个元素</p>
<p><code>A0, A1</code>--->;<code>predict([A0,A1])</code>--->;<code>Ap2</code></p>
<p><code>A0, A1, Ap2</code>--->;<code>predict([A0,A1,Ap2])</code>--->;<code>Ap3</code></p>
<p><code>*|A0|* A1, Ap2, Ap3</code>--->;<code>predict([Ap1,Ap2,Ap3])</code>--->;<code>Ap4</code>[缩短输入]</p>
<p>这里是棘手的部分,因为您可以注意到,当输入有3个以上的元素时,输入数据会向右移动一个位置。
我决定采用这种“滑动窗口”方法,因为否则计算<code>A17</code>的输入将包括所有<code>AX</code>,其中<code>X</code><;17。所以最多有3个元素作为初始输入就足够了</p>
<p>========================================================================</p>
<p>为了进一步说明,我还将提供<code>A2</code>的例子。你知道吗</p>
<p>3)病例<code>A2</code></p>
<p><code>A0, A1, A2</code>--->;<code>predict([A0,A1,A2])</code>--->;<code>Ap3</code></p>
<p><code>*|A0|*, A1, A2, Ap3,</code>--->;<code>predict([A1,Ap2,Ap3])</code>--->;<code>Ap4</code>[缩短输入]</p>
<p><code>*|A0|* *|A1|*, Ap2, Ap3, Ap4</code>--->;<code>predict([Ap2,Ap3,Ap4])</code>--->;<code>Ap5</code>[缩短输入]</p>
<p>========================================================================</p>
<p>如您所见,当初始输入大于3时,有一个通用模式,必须使用一些“滑动窗口”方法。当初始输入小于3时,存在一些特殊情况</p>
<p>为了简化所有这些内容,我使用了以下代码:</p>
<pre><code>current_trace = [[2,4,6,7,6,3],[1,2,5,7,2,7],[6,4,7,1,8,2]]
def predict(lst):
print "predicting for", lst
print "result", max(lst) + 0.0
return max(lst) + 0.0
</code></pre>
<p>方法1:</p>
<pre><code>for user_trace in current_trace:
y = 1
for counter in range(len(user_trace)):
while y <= 3:
x = 0
intermediate_list = user_trace[x:y]
while len(intermediate_list) <= 5:
next_prediction = predict(intermediate_list)
intermediate_list.append(next_prediction)
#predict(user_trace[x:y])
#print "@while" ,user_trace[x:y]
print "end of prediction \n"
y += 1
else:
print "\n"
x = y - 3
if len(user_trace[x:y]) == 3:
predict(user_trace[x:y])
#print "@else" ,user_trace[x:y]
else:
pass
y += 1
</code></pre>
<p>方法2:</p>
<pre><code>for user_trace in current_trace:
for slicer in range(len(user_trace)):
new_list = user_trace[:slicer+1]
if len(new_list) <= 3:
print "slicer:", slicer
print new_list
else:
print "slicer:", slicer
newer_list = new_list[-3:]
print newer_list
</code></pre>
<p>在这两种情况下,我都遗漏了一些东西,希望有人能给我一个意见,或有益的建议,因为我已经忙于这件事好几天了,这让我很沮丧!你知道吗</p>
<p>提前谢谢</p>
<p>最好的,
W型</p>