2016-04-12 3 views
5

У меня есть набор из n координатных точек вида (x, y, z). Они хранятся в матрице n x 3 M.Расчет кластеризации и расстояний в Julia

Есть ли встроенная функция в Юлии для расчета расстояния между каждой точкой и каждой другой точкой? Я работаю с небольшим количеством точек, поэтому время вычисления не слишком важно.

Моя общая цель - запустить алгоритм кластеризации, поэтому, если есть алгоритм кластеризации, который я могу посмотреть, это не требует, чтобы я сначала вычислил эти расстояния, пожалуйста, предложите это тоже. Ниже приведен пример данных, которые я хотел бы выполнить для кластеризации. Очевидно, мне нужно было сделать это только для z-координаты.

Example of data set I need to perform clustering on

+0

Есть несколько различных алгоритмов кластеризации. Какую кластеризацию вы хотите запустить? – niczky12

+0

У меня есть набор данных, дающий координаты (x, y, z) двух отдельных висящих электрических кабелей. Они различаются только по оси z (высота). Таким образом, я хотел бы группировать на основе координат z. Однако кластеризация, использующая прямую линию для отсечения кластеров, не работает, поскольку самая низкая точка верхней контактной точки может быть ниже самой высокой точки нижней контактной точки. В настоящее время я разделяю контактную запись на маленькие кусочки, где работает кластеризация с линейной линией, но это не очень аккуратное решение. – lara

ответ

7

Для расчета расстояния использовать Distancespackage.

С учетом матрицы X вы можете рассчитать попарные расстояния между столбцами. Это означает, что вы должны указать свои входные точки (ваши n объектов) в столбцы матриц. (В своем вопросе вы упоминаете NX3 матрицу, так что вам придется перенести это с помощью функции transpose().)

Вот пример того, как использовать его:

>using Distances # install with Pkg.add("Distances") 

>x = rand(3,2) 

3x2 Array{Float64,2}: 
0.27436 0.589142 
0.234363 0.728687 
0.265896 0.455243 

>pairwise(Euclidean(), x, x) 

2x2 Array{Float64,2}: 
0.0  0.615871 
0.615871 0.0  

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

+0

Спасибо. Теперь, когда я пробую это по другой проблеме с большим количеством данных, я получаю ошибку из памяти. Любая идея, как можно вычислить матрицу расстояний на огромном наборе данных? – lara

5

Только для полноты ответа @ niczky12 есть пакет в Julia, который называется Clustering, который по сути, как говорится в названии, позволяет выполнять кластеризацию.

Образец kmeans алгоритм:

>>> using Clustering   # Pkg.add("Clustering") if not installed 

>>> X = rand(3, 100)   # data, each column is a sample 
>>> k = 10     # number of clusters 

>>> r = kmeans(X, k) 
>>> fieldnames(r) 
8-element Array{Symbol,1}: 
:centers  
:assignments 
:costs  
:counts  
:cweights 
:totalcost 
:iterations 
:converged 

Результат сохраняется в возврате kmeans (r), который содержит указанные выше поля. Два, возможно, наиболее интересных поля: r.centers содержит центры, обнаруженные алгоритмом kmeans, и r.assigments содержит кластер, к которому принадлежит каждый из 100 выборок.

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


В вашем случае, как ваши данные является N x 3 матрицей вам нужно только перенести его:

M = rand(100, 3) 
kmeans(M', k)