找到有效数字

时间:2016-04-27 08:43:50

标签: python math

我有一个相当复杂的游戏相关问题。这是问题的简化版本。我有一个“好”数字列表。

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,key = lambda x:x [1])

[('108',1489),(''103',1504),(''299',2032),(''543',4230),('999',10156)]

2 个答案:

答案 0 :(得分: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 :(得分:1)

制作某种数据群集。我认为k-Means或其他算法应该包含在python math / scipy库中。

找到质心和每个簇的权重(对于(542,544)质心为543,质量为2)。

为您的“得分”选择所需的指标 - 它可以是距离最近的质心的简单反距离,加权距离(会计群集大小Weight/R),引力幂Weight/R^2等等。