Re: Add low-memory special case for Euclidean single-linkage clustering

Julien Jerphanion <[email protected]> Fri, 07 Jul 2023 06:20:40 +0000
Newsgroups gmane.comp.python.scientific.devel
Message-ID <A9P4qSx_rEpP4O8kucreL886eoJtLoUGii0t2lkNTyYXXkfwJbN4-AQWLLKR8KiWtOUJIHGVnQDPvJZwCRpVxhYtQ8sHPZOyVhVSdKmOY2Q=@jjerphan.xyz>
After profiling some runs on this `AgglomerativeClustering(linkage='single')`,
the bottleneck is present in `mst_linkage_core` [1].

This computes a distance matrice and performs operations on it suboptimally [2].

Fortunately, this implementation can be optimized as part of some current efforts on
improving some patterns of computations [3].

I will add an item indicating that `mst_linkage_core` can be optimized.

Best Regards,

Julien.

1: https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/cluster/_agglomerative.py#L559C33-L559C49
2: https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/cluster/_hierarchical_fast.pyx#L428-L506
3: https://github.com/scikit-learn/scikit-learn/issues/25888

------- Original Message -------
On Thursday, July 6th, 2023 at 2:16 PM, Julien Jerphanion <[email protected]> wrote:


> Hi,
> 

> OK, thank you for reporting that. I do not think `AgglomerativeClustering` would be suitable for now.
> 

> The implementation uses a UnionFind, but it seems that other parts of the
> implementations are costly.
> 

> I can look into that when I get time one day.
> 

> Julien.
> 

> 

> ------- Original Message -------
> On Wednesday, July 5th, 2023 at 11:50 PM, Mathias Rav [email protected] wrote:
> 

> 

> 

> > On Wed, 05 Jul 2023 20:39:37 +0000
> > Julien Jerphanion [email protected] wrote:
> 

> > > I think that `sklearn.cluster.AgglomerativeClustering`ยน implements
> > > what you propose.
> 

> > > This implementation also supports other dissimilarities such as the
> > > cosine dissimilarity and the Manhattan distance.
> 

> > Hi Julien
> 

> > Thanks for the pointer! I just tried to run AgglomerativeClustering with
> > linkage="single" on 10k, 20k, 40k, 80k 2-d points and the runtimes
> > indicate a super-quadratic time complexity: 0.33, 1.45, 5.96, 24.2 s.
> 

> > Given that my use case involves around 200k points in 3-d,
> > I'd like something closer to O(N log N) time - is that possible with
> > AgglomerativeClustering?
> 

> > Cheers,
> > Mathias
> > _______________________________________________
> > SciPy-Dev mailing list -- [email protected]
> > To unsubscribe send an email to [email protected]
> > https://mail.python.org/mailman3/lists/scipy-dev.python.org/
> > Member address: [email protected]_______________________________________________
> 

> SciPy-Dev mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
> https://mail.python.org/mailman3/lists/scipy-dev.python.org/
> Member address: [email protected]

_______________________________________________
SciPy-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/scipy-dev.python.org/
Member address: [email protected]
publickey - [email protected] - 0xDEDBF4EA.asc (application/pgp-keys, 3 KB)
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
WFaaDg==
=/cO6
-----END PGP PUBLIC KEY BLOCK-----
signature.asc (application/pgp-signature, 855 B)
-----BEGIN PGP SIGNATURE-----
Version: ProtonMail

wsFzBAEBCAAnBYJkp66qCZBWtpCpfC41uBYhBN7b9Or9ieiZmPAnSVa2kKl8
LjW4AACoqxAAqq/2HgTeQysZnabX+Ry13FHmyyQNby4PeTk1IbHH4XYFXa9/
0jmOWSXp8Y+l5eNdgoaYaTBoW5WbGKl6G2NDsM4z94Sn0a6Vzb/JltuYxQhN
i3b8JtPVuy6ThIGzZS4uNVGe2cbF6RUl8zyENMoiZRPr/K9bZP7/YBxD52Zf
uNdarEd+aX0YJONd/RQumg0pRwEEuH7CVJqt5yuRq9HfQ8Qvm+cPevvUUsTK
03Mojf5/oD6J7LAEze4G7ihEt8J+tJ4IerMvFCcACn14bbzYV9EMWL4sucdG
LTYzpr1GlOpAOwVB5CgfUmnw7Z588xIvLiKIm0e6qYeAmPmkObeGIzcBI0YD
kobyimp1ZlCKDDJPX/qk9WGV4pEAZjc6N/jZZmCZtg3dS1v1nzs0Qrea0Xhc
nBmGoGSlcqp+2TJlVEZizqzp+5eRXMuqR6lekoJU91U+jhWAiyQ+H5zP1U+X
ShvjxHJ2nrlPg+1arrx2VfA2vVVKVstUhh1UkAsH0Jq1NMNpOjTQfZRaafZ9
/ptUAfaOGd1Ab5Yc3uaH0WbX2v9ChEE6qJGiFlWi0IFT7mXQkIBCW6Gjf/Lr
6tNZUUMDPWehpgnv2b4s2KHXlfy+Fnv7t1+kFeIB/NTZsGy0+GxQcULCRTEy
2tK/V1cudbDkd59p2WPL4vgIPvbT4Kh8jwQ=
=gJkd
-----END PGP SIGNATURE-----