私はかなり複雑なゲーム関連の問題があります。ここに問題の簡略版があります。私は「良い」数字のリストを持っています。有効な番号からの距離を見つける
100
101
102
104
105
106
107
220
221
289
290
顧客は、3つの数字103、299および999
103の選択肢を持っている、それは良い数字に最も近いので、最良の選択です。良い数字からの距離があるため、299は999より良い選択肢です。
私はpythonには「距離」を計算する組み込み関数がないと思います。しかし、Pythonは以前私を驚かせました。
各値の距離を見つける必要があります。例えば、
103 0.9
299 0.2
999 0.1
私はAmazonから機械学習を試みましたが、すべての数値に対して同じ重みを返します。
更新:
mylist="""100
101
102
104
105
106
107
220
221
289
290
542
544
"""
z = """103
299
999
108
543
"""
finallist=[]
for y in z.split():
newlist=[]
for i in mylist.split():
diff=int(y)-int(i)
newlist.append(abs(diff))
finallist.append((y, min(newlist)))
finallist
[('103', 1), ('299', 9), ('999', 455), ('108', 1), ('543', 1)]
1)103及び108は、額面です。しかし、103が102の間と104、I 103
2の重量を増加させるために必要されているため、より関連性がある)103が
542との間及び544であってもよいことが543よりも重要でも連続シリーズの一部であり、3)amazon MLはこの計算をすべて行い、「スコア」を提供します。しかし、この場合はうまくいきませんでした。アップデート2
:
は、MIN関数を除去し、各値の出現回数をカウントリスト
# finallist.append((y, newlist))
にすべての値を保存しました。それは私がこの順にソートしようと108と543
と比較して1,2及び3の2つのオカレンスを有するため
from collections import Counter
for i, d in finallist:
c=Counter(d)
print i, c.most_common()
103 [(1, 2), (2, 2), (3, 2), (4, 1), (117, 1), (118, 1), (439, 1), (441, 1), (186, 1), (187, 1)]
299 [(192, 1), (193, 1), (194, 1), (195, 1), (197, 1), (198, 1), (199, 1), (9, 1), (10, 1), (78, 1), (79, 1), (243, 1), (245, 1)]
999 [(897, 1), (898, 1), (899, 1), (709, 1), (710, 1), (455, 1), (457, 1), (778, 1), (779, 1), (892, 1), (893, 1), (894, 1), (895, 1)]
108 [(1, 1), (2, 1), (3, 1), (4, 1), (6, 1), (7, 1), (8, 1), (112, 1), (113, 1), (434, 1), (436, 1), (181, 1), (182, 1)]
543 [(1, 2), (322, 1), (323, 1), (436, 1), (437, 1), (438, 1), (439, 1), (441, 1), (442, 1), (443, 1), (253, 1), (254, 1)]
103は、より適切である:
103 because it has highest number of double occurances
108 because it is part of contiguous list
543 because of the instance of double occurance
299 because closer to list
999 least relevant
その場合私は103、543、108を得れば可能ではない、それは
...アップデート3 okです:
私は答えの中で示唆されているように最小値の代わりに平均値を試しました。
# finallist.append((y, sum(newlist)/len(mylist)))
ここで、オーダーは108,103,299,543および999であり、これは予期しないものです。非常に大きな数字がリストに追加された場合、これは変更される可能性があります。
[('103', 28.923076923076923),
('299', 39.07692307692308),
('999', 195.30769230769232),
('108', 28.634615384615383),
('543', 81.34615384615384)]
最終更新:
私は単純に合計を計算して、ソートされます。これは期待された結果を返しませんが、距離に基づいて各値に「重み」を割り当てる方法がわからないため、この回答を受け入れます。
finallist.append((y, sum(newlist)))
ソート(finallist、キー=ラムダX:X [1])
[( '108'、1489)、( '103'、1504)、( '299'、2032)、 ( '543'、4230)、( '999'、10156)]
どのように距離を定義しますか? – svs
したがって、「距離」が大きいほど「近い」でしょうか? –
はい。より大きな距離が近い。しかし、それは難しくて速いルールではありません。私がする必要があるのは、最初の番号か最後の番号を並べ替えて取り出すことだけです。 – shantanuo