2016-04-27 21 views
-3

私はかなり複雑なゲーム関連の問題があります。ここに問題の簡略版があります。私は「良い」数字のリストを持っています。有効な番号からの距離を見つける

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)]

+2

どのように距離を定義しますか? – svs

+0

したがって、「距離」が大きいほど「近い」でしょうか? –

+0

はい。より大きな距離が近い。しかし、それは難しくて速いルールではありません。私がする必要があるのは、最初の番号か最後の番号を並べ替えて取り出すことだけです。 – shantanuo

答えて

1

実線上のある点から別の点までの通常の距離は、その差の絶対値です。

abs(a - b) 

だから距離の反復子(のpython3)は次のとおりです。map(lambda x: abs(x-a), l) そこから、あなたが良い数字に最高年齢距離を有する点がポイントである平均的に距離

average_distance = sum(map(lambda x: abs(x-a), good_numbers))/len(good_numbers) 

を計算することができます良い数字に最も近い傾向があります。平均は、最小とは異なり、良い数字に最も近い点を与えるわけではありませんが、全体的にはそれらに最も近い点です。

1

何らかのデータを作成クラスタ化。私はk-Meansや他のアルゴリズムをpythonの数学/ scipyライブラリに含めるべきだと思います。

セントロイドを検索し、すべてのクラスタの重み((542,544)セントロイドの質量は543、質量は2)。

は、あなたの「スコア」のためのメトリックを必要として選択します - それはように、単純な逆に最も近い重心までの距離、重み付き距離(会計クラスタサイズWeight/R)、重力の力Weight/R^2と可能性があります。

関連する問題