2016-04-12 2 views
5

J'ai une collection de n points de coordonnées de la forme (x, y, z). Ceux-ci sont stockés dans une matrice n x 3 M.Clustering et calcul de distance dans Julia

Y a-t-il une fonction intégrée dans Julia pour calculer la distance entre chaque point et chaque autre point? Je travaille avec un petit nombre de points afin que le temps de calcul ne soit pas trop important.

Mon objectif général est d'exécuter un algorithme de clustering, donc s'il existe un algorithme de clustering que je peux examiner et qui ne nécessite pas de calculer ces distances, merci de le suggérer également. Un exemple de données sur lesquelles j'aimerais effectuer un regroupement est ci-dessous. Évidemment, je n'aurais qu'à le faire pour la coordonnée z.

Example of data set I need to perform clustering on

+0

Il existe plusieurs algorithmes de regroupement différents. Quel genre de cluster voulez-vous exécuter? – niczky12

+0

J'ai un jeu de données donnant les coordonnées (x, y, z) de deux câbles électriques suspendus séparés. Ils diffèrent le long de l'axe z (hauteur) seulement. Ainsi, j'aimerais regrouper en fonction des coordonnées z. Cependant, le regroupement qui utilise une ligne droite pour couper les groupes ne fonctionne pas puisque le point le plus bas de la caténaire supérieure peut être plus bas que le point le plus haut de la caténaire inférieure. Je suis en train de scinder la caténaire en petits morceaux où le clustering en ligne droite fonctionne mais ce n'est pas une solution très soignée. – lara

Répondre

7

Pour calculer les distances utiliser la Distancespackage. Étant donné une matrice X, vous pouvez calculer des distances par paires entre les colonnes. Cela signifie que vous devez fournir vos points d'entrée (vos n objets) pour être les colonnes des matrices. (Dans votre question vous parler de matrice NX3, donc vous devez transposer cela avec la fonction transpose().)

Voici un exemple sur la façon de l'utiliser:

>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  

Comme vous pouvez le voir les déclarations ci-dessus la matrice de distance entre les colonnes de X. Vous pouvez utiliser d'autres métriques de distance si vous en avez besoin, il suffit de vérifier les documents pour le paquet.

+0

Merci. Maintenant, quand j'essaye ceci sur un autre problème avec plus de données, j'obtiens l'erreur de mémoire insuffisante. Une idée de comment une matrice de distance peut-elle être calculée sur un énorme ensemble de données? – lara

5

Juste pour être complet à la réponse @ niczky12, il y a un paquet dans Julia appelé Clustering qui, comme son nom l'indique, permet essentiellement d'effectuer des clusters.

Un échantillon kmeans algorithme:

>>> 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 

Le résultat est stocké dans le retour des kmeans (r) qui contient les champs ci-dessus. Les deux champs probablement les plus intéressants: r.centers contient les centres détectés par l'algorithme kmeans et r.assigments contient le cluster auquel appartient chacun des 100 échantillons.

Il existe plusieurs autres méthodes de clustering dans le même package. N'hésitez pas à plonger dans la documentation et à appliquer celle qui correspond le mieux à vos besoins.


Dans votre cas, que vos données sont une seule matrice vous N x 3 besoin de transposer:

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