У меня есть большая матрица со значениями, которые сильно различаются по порядку величины. Чтобы вычислить сумму как можно точнее, мой подход состоял бы в том, чтобы изменить ndarray на 1-мерный массив, отсортировать его и затем добавить его, начиная с наименьших записей. Есть ли лучший/более эффективный способ сделать это?Каков наиболее эффективный способ суммирования ndarray в numpy при минимизации неточности с плавающей запятой?
ответ
Я думаю, что при заданных задачах с плавающей запятой наиболее известным алгоритмом для вашей задачи является Kahan summation. Для практических целей суммирование Кахана имеет погрешность, которая не зависит от количества слагаемых, тогда как наивное суммирование имеет погрешность, которая линейно растет с числом слагаемых.
NumPy не использует суммирование Kahan, и нет простого способа его реализации без большого компромисса с производительностью. Но он использует следующую лучшую вещь, pairwise summation, где ошибка растет при некоторых разумных предположениях, как квадратный корень логарифма числа слагаемых.
Поэтому очень вероятно, что Numpy сам по себе уже способен обеспечить достаточно хорошую точность для вашей проблемы. Чтобы проверить это, я бы на самом деле выполнил несколько выборочных случаев с помощью суммирования Кахана (псевдокод в ссылке Википедии выше может быть преобразован тривиально в Python) и считать это как золотой, наилучший возможный результат и сравнить его с:
- Вызов
np.sum
на вашей матрице как есть. - Вызов
np.sum
на матрицу после преобразования в 1D, что может дать лучшие результаты, если ваша матрица не смежна в памяти. - Вызов
np.sum
на отсортированную версию массива 1D.
Для большинства случаев эти три последних варианта должны вести себя аналогичным образом, но единственный способ знать - это проверить его.
Три варианта np.sum действительно дали тот же результат, но суммирование Kahan улучшило его заметно. Благодаря! –
Существует «math.fsum», который, как предполагается, дает лучшую точность. – hpaulj
- 1. Неточности с плавающей запятой
- 2. Примеры неточности с плавающей запятой
- 3. Неточности с плавающей запятой в c
- 4. Каков наиболее эффективный способ сравнить каждое значение 2 numpy-матриц?
- 5. Избегайте неточности при использовании чисел с плавающей запятой?
- 6. Учет неточности с плавающей запятой при тестировании «примерно больше»
- 7. Каков наиболее эффективный способ подразделить большой список?
- 8. Каков наиболее эффективный способ расширения размера массива 4D numpy?
- 9. Каков наиболее эффективный способ взаимодействия с Singleton?
- 10. Почему ndarray разрешает индексы с плавающей запятой
- 11. Каков наиболее эффективный способ индексирования адресов электронной почты в MySQL?
- 12. Каков наиболее эффективный способ фильтрации DataFrame
- 13. Каков наиболее эффективный способ обработки этой функции?
- 14. Каков наиболее эффективный способ получить результаты Elasticsearch?
- 15. Источники неточности для чисел с двойной плавающей запятой
- 16. Какая польза от принятия неточности с плавающей запятой в C#
- 17. Каков наиболее эффективный способ суммирования дробной части двойника и приращения, когда он «переполняется»?
- 18. Каков наиболее эффективный способ добавления метаданных schema.org
- 19. Каков наиболее эффективный способ обрезать эту таблицу?
- 20. Каков наиболее эффективный способ сортировки NSSet?
- 21. Каков наиболее эффективный способ запроса MongoDB?
- 22. Каков наиболее эффективный способ фильтрации поиска?
- 23. Каков наиболее эффективный способ организовать множество методов?
- 24. Каков наиболее эффективный способ отправки виртуальной машины?
- 25. Каков наиболее эффективный способ хранения маяков аналитики?
- 26. Каков наиболее эффективный способ перенаправления запросов?
- 27. Каков наиболее эффективный способ синхронизации двух datagridviews?
- 28. Каков наиболее эффективный способ хранения этих данных?
- 29. Каков наиболее эффективный способ сохранения списков?
- 30. Каков наиболее эффективный способ загрузки пользовательского каталога?
Не уверен в точности, но для производительности вы можете посмотреть в модуль 'numexpr'. – Divakar
Посмотрите [здесь] (http://code.activestate.com/recipes/298339-more-accurate-sum/) –
Почему numpy.sum (matrix) не выполняет эту работу за вас? Как вы измеряете, что это неточно? – Ohumeronen