将浮点数列表匹配到最接近的整数,而无需重复

马克·斯帕克

我有一种算法正在尝试实现,而我正努力寻找一种实现它的好方法。目标是获取一个浮点数列表,并与整数列表进行一对一映射,这样就不会有两个浮点数被映射到同一整数,并且该映射具有最小的可能误差(无论是总误差还是误差或均方误差)。

例如,假设我有数字[2.1, 2.3, 2.4, 7, 7.5, 8.9, 9.3]我希望它返回如下内容:

{
    2.1: 1,
    2.3: 2, 
    2.4: 3,
    7: 7,
    7.5: 8,
    8.9: 9,
    9.3: 10
}

请注意,聚集在2周围的数字必须分散为1、2和3。

可能要提一提,我的动机是在音乐上实用的:将一系列微音高的音调(注意“裂纹之间”)映射到钢琴的琴键。因此,实际上,我只需要一个“足够好”的解决方案,尽管真正的最佳解决方案会更令人兴奋!

另外,我正在使用Python工作,但是当然,这里的真正问题不是特定于语言的。

萨沙

也许不是最优雅,最有效的代码,但是:

  • 这是多项式复杂性
  • 它提供了全局最优

基本思路:

  • 计算一些最坏情况的候选范围(我们一定不要忘记任何可能改进的候选范围)
    • 我没有投入太多->一个“ hack”
  • 计算距离矩阵
  • 解决矩形线性分配问题

码:

import math
import numpy as np
from scipy.optimize import linear_sum_assignment
from scipy.spatial.distance import cdist

SQUARED_PENALTY = True

data = np.array([2.1, 2.3, 2.4, 7, 7.5, 8.9, 9.3])

# hacky safety-net -> which candidates to look at
min_ = math.floor(data.min())
max_ = math.ceil(data.max())
gap = max_ - min_

cands = np.arange(min_ - gap, max_ + gap)

cost_matrix = cdist(data[:, np.newaxis], cands[:, np.newaxis])

if SQUARED_PENALTY:
  cost_matrix = np.square(cost_matrix)

row_ind, col_ind = linear_sum_assignment(cost_matrix)

solution = cands[col_ind]

print(solution)
print('cost: ', np.round(cost_matrix[row_ind, col_ind].sum(), 3))

产出:l1-成本

[ 2  1  3  7  8  9 10]
cost:  3.3

产出:费用平方

[ 1  2  3  7  8  9 10]
cost:  2.41

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将整数列表转换为浮点数

来自分类Dev

将浮点数转换为下一个整数,而不是最接近的整数?

来自分类Dev

浮点数列表的用户输入不重复

来自分类Dev

匹配浮点数或整数

来自分类Dev

将 csv 持久化的浮点数列表读回到浮点数列表中

来自分类Dev

将数据框中的舍入舍入到最接近的特定浮点值(舍入到非整数列表)

来自分类Dev

给定一个浮点数,查找列表中还是最接近的数字

来自分类Dev

Python将浮点数四舍五入到最接近的0.05

来自分类Dev

遍历浮点数列表

来自分类Dev

浮点数列表/元组的“ in”语句

来自分类Dev

您如何找到浮点数的最接近非等值?

来自分类Dev

如何找到与给定浮点数最接近的行

来自分类Dev

将带符号的单精度浮点数舍入到最接近的整数的有效方法是什么?

来自分类Dev

如何用一个浮点数的步骤遍历整数列表?

来自分类Dev

如何从浮点数列表中获取python中的公共整数?

来自分类Dev

将列表字符串转换为浮点数列表[pandas]

来自分类Dev

将浮点数比较为整数

来自分类Dev

将浮点数转换为整数

来自分类Dev

将整数转换为浮点数

来自分类Dev

javascript:将浮点数四舍五入到最接近的.25(或其他值)。

来自分类Dev

如何将浮点数四舍五入到最接近的最大int数?

来自分类Dev

将两个浮点数列表相乘时,“ TypeError:无法将序列乘以'float'类型的非整数”

来自分类Dev

如何获取熊猫中浮点数列的整数部分

来自分类Dev

浮点数的整数

来自分类Dev

如何使用函数样式将字符串解析为浮点数列表?

来自分类Dev

如何将csv文件的第二列转换为浮点数列表?

来自分类Dev

如何将两个浮点数列表相乘

来自分类Dev

Python 2.7.5错误打印浮点数列表

来自分类Dev

在浮点数列表上使用python函数any()

Related 相关文章

  1. 1

    将整数列表转换为浮点数

  2. 2

    将浮点数转换为下一个整数,而不是最接近的整数?

  3. 3

    浮点数列表的用户输入不重复

  4. 4

    匹配浮点数或整数

  5. 5

    将 csv 持久化的浮点数列表读回到浮点数列表中

  6. 6

    将数据框中的舍入舍入到最接近的特定浮点值(舍入到非整数列表)

  7. 7

    给定一个浮点数,查找列表中还是最接近的数字

  8. 8

    Python将浮点数四舍五入到最接近的0.05

  9. 9

    遍历浮点数列表

  10. 10

    浮点数列表/元组的“ in”语句

  11. 11

    您如何找到浮点数的最接近非等值?

  12. 12

    如何找到与给定浮点数最接近的行

  13. 13

    将带符号的单精度浮点数舍入到最接近的整数的有效方法是什么?

  14. 14

    如何用一个浮点数的步骤遍历整数列表?

  15. 15

    如何从浮点数列表中获取python中的公共整数?

  16. 16

    将列表字符串转换为浮点数列表[pandas]

  17. 17

    将浮点数比较为整数

  18. 18

    将浮点数转换为整数

  19. 19

    将整数转换为浮点数

  20. 20

    javascript:将浮点数四舍五入到最接近的.25(或其他值)。

  21. 21

    如何将浮点数四舍五入到最接近的最大int数?

  22. 22

    将两个浮点数列表相乘时,“ TypeError:无法将序列乘以'float'类型的非整数”

  23. 23

    如何获取熊猫中浮点数列的整数部分

  24. 24

    浮点数的整数

  25. 25

    如何使用函数样式将字符串解析为浮点数列表?

  26. 26

    如何将csv文件的第二列转换为浮点数列表?

  27. 27

    如何将两个浮点数列表相乘

  28. 28

    Python 2.7.5错误打印浮点数列表

  29. 29

    在浮点数列表上使用python函数any()

热门标签

归档