Лучший язык программирования для реализации алгоритма DBSCAN запросов к базе данных MongoDB?

Я хочу реализовать алгоритм DBSCAN. Предполагая начать с этого псевдокода

DBSCAN(D, eps, MinPts)
   C = 0
   for each unvisited point P in dataset D
      mark P as visited
      NeighborPts = regionQuery(P, eps)
      if sizeof(NeighborPts) < MinPts
         mark P as NOISE
      else
         C = next cluster
         expandCluster(P, NeighborPts, C, eps, MinPts)

expandCluster(P, NeighborPts, C, eps, MinPts)
   add P to cluster C
   for each point P' in NeighborPts 
      if P' is not visited
         mark P' as visited
         NeighborPts' = regionQuery(P', eps)
         if sizeof(NeighborPts') >= MinPts
            NeighborPts = NeighborPts joined with NeighborPts'
      if P' is not yet member of any cluster
         add P' to cluster C

regionQuery(P, eps)
   return all points within P's eps-neighborhood

Мой код должен работать наAmazon EC2 Экземпляр с Ubuntu Linux 64 бит.

ФункцияregionQuery запрашиваетMongoDB базу данных для получения всех точек в пределах eps-окрестности P.

Итак, по вашему мнению, какой язык программирования является лучшим для его реализации для улучшения производительности?C, PHP, Java (Я не думаю)?

Ответы на вопрос(3)

Я забыл ответить на свой вопрос. Я наконец-то реализовал версию алгоритма DBSCAN MapReduce. Вы можете найти этоhere (Hadoop).

Это псевдокод того, как это работает:

function map(P, eps, MinPts)
    if P is unvisited then
        mark P as visited
        NeighborPts = regionQuery(P, eps)
        if sizeof(NeighborPts) < MinPts then
            do nothing
        else
            mark P as clusterized
            prepare the key
            create new cluster C
            C.neighborPoints = NeighborPts
            C.points = P
            emit(key, C)

function reduce(key, clusters, eps, MinPts)
    finalC is the final cluster
    for all C in clusters do
        finalC.points = finalC.points ∪ C.points
        for all P in C.neighborPoints do
            if P′ is not visited then
                mark P′ as visited
                NeighborPts′ = regionQuery(P′,eps)
                if sizeof(NeighborPts′) ≥ MinPts then
                    NeighborPts = NeighborPts ∪ NeighborPts′
                end if
            end if
            if P′ is not yet member of any cluster then
                add P′ to cluster C
            end if

Google для "параллельного DBSCAN", и вы найдете ряд статей, обсуждающих, как распараллелить этот алгоритм. Обычно это немного меняет алгоритм, например, для этого потребуется объединение кластеров.

Предварительная кластеризация Canopy также может быть хорошим шагом предварительной обработки для DBSCAN.

Решение Вопроса

Я предполагаю, что у вас много очков и вам нужны быстрые результаты - в противном случае вы можете использовать практически все, что угодно.

Для меня это похоже на работу по сокращению карты

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

Расширение кластера должно перейти к сокращению и, возможно, завершению части - также выбор языка будет javascript, и все будет происходить внутри Монго

Ваш ответ на вопрос