2016-04-27 42 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 

我試過機器學習亞馬遜,但它返回所有數字相同的權重。


更新:

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之間,我想增加103

2)103重量也連續系列的一部分,因此比543更重要的是,可以542和544

之間處於

3)亞馬遜ML做所有這些計算並提供「分數」。但這在這種情況下不起作用。


更新2:

除去min函數並保存所有的值到列表

# finallist.append((y, newlist)) 

計數出現的次數爲每個值。

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是更相關的,因爲它相較於108和543

具有2次出現的1,2和3的我試圖以該順序進行排序:

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:

我嘗試了答案中建議的平均值而不是最小值。

# 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 math/scipy庫中。

查找質心和每個羣的權重(對於(542,544)質心是543,質量是2)。

選擇需要爲您的「分數」 指標 - 它可能是最接近的重心簡單的反距離,加權距離(會計簇大小Weight/R),重力功率Weight/R^2等。