Используйте горутины Google Go для создания байесовской сети

У меня есть большой набор данных философских аргументов, каждый из которых связан с другими аргументами как доказательство или опровержение данного утверждения. Корневое утверждение может иметь много доказательств и опровержений, каждое из которых также может иметь доказательства и опровержения. Утверждения также можно использовать в нескольких графиках, а графики можно анализировать в «заданном контексте» или предположении.

Мне нужно построить байесовскую сеть связанных аргументов, чтобы каждый узел справедливо и точно распространял влияние на связанные с ним аргументы; Мне нужно иметь возможность рассчитать вероятность цепочек подключенных узлов одновременно, причем каждый узел требует поиска в хранилище данных, который должен блокироваться для получения результатов; процесс в основном связан с вводом-выводом, и мое соединение с хранилищем данных может работать асинхронно в java, go и python {google appengine}.После завершения каждого поиска он распространяется на все другие подключенные узлы до тех пор, пока дельта вероятности не упадет ниже порога нерелевантности {в настоящее время 0,1%}. Каждый узел процесса должен вычислять цепочки соединений, а затем суммировать все результаты по всем запросам, чтобы скорректировать результаты достоверности, при этом результаты привязываются к любым связанным аргументам.

Чтобы избежать бесконечного повторения, я думал об использовании A*-подобного процесса в горутинах для распространения обновлений карт аргументов с эвристикой, основанной на сложном влиянии, которое игнорирует узлы, когда вероятность влияния падает ниже, скажем, 0,1. % . Я пытался настроить вычисления с помощью триггеров SQL, но это слишком быстро усложнялось и запутывалось. Затем я перешел на google appengine, чтобы воспользоваться преимуществами асинхронного nosql, и это было лучше, но все еще слишком медленно. Мне нужно запускать обновления достаточно быстро, чтобы получить быстрый пользовательский интерфейс, поэтому, когда пользователь создает или голосует за или против доказательства или опровержения, он может сразу увидеть результаты, отраженные в пользовательском интерфейсе.

Я думаю, что язык Go является предпочтительным для поддержки параллелизма, в котором я нуждаюсь, но я открыт для предложений. Клиент представляет собой монолитное приложение JavaScript, которое просто использует XHR и веб-сокеты для передачи и извлечения карт аргументов {и их обновлений} в режиме реального времени. У меня есть прототип Java, который может вычислять большие цепочки за 10–15 секунд, но мониторинг производительности показывает, что большая часть моего времени выполнения тратится на синхронизацию и накладные расходы от ConcurrentHashMap.

Если есть другие высококонкурентные языки, которые стоит попробовать, дайте мне знать.Я знаю java, python, go, ruby ​​и scala, но выучу любой язык, если он мне подходит.

Аналогичным образом, если существуют реализации огромных байесовских сетей с открытым исходным кодом, пожалуйста, оставьте предложение.

7
задан Ajax 16 May 2012 в 05:28
поделиться