Esta medalla tiene dos caras.
Por un lado, aunque ya hay mucho código, también hay muchos errores en este código. Puede que se haya probado sólo en conjuntos de datos muy pequeños, y una vez que se ejecuta en datos mucho más grandes se vuelve increíblemente lento. O está estrechamente ligado a datos bidimensionales, a un tipo de datos concreto, lo que sea. Así que al reutilizar el código existente, puedes acabar descubriendo que es incorrecto, lento o que necesita ser reescrito para funcionar con tus datos.
Por otro lado, es probable que también cometa algunos errores o decisiones que limiten el rendimiento de sus códigos. Es posible que estos problemas ya se hayan solucionado en el código existente. El uso de bibliotecas existentes también puede proporcionarle una funcionalidad que no consideraba necesaria al principio, pero que al final le resulta muy valiosa. Además, puede darle acceso a la comparación con otros métodos, la visualización, la depuración, la evaluación, etc.
Mi recomendación es la siguiente:
Haga buscar los códigos existentes. Pero compruebe si son realmente escrito y diseñado para la extensibilidad y la reutilización . Hay algunos buenos ejemplos: libSVM es el estándar de facto para las máquinas de vectores de apoyo, y se utiliza en casi todas partes. Debe haber enlaces para más de 20 idiomas. En lugar de reescribir SVM, este es definitivamente un código para reutilizar. O ELKI de la que soy bastante fan, es un marco de trabajo Java para la agrupación y la detección de valores atípicos (aunque todavía no tiene aprendizaje automático). Cuesta un poco acostumbrarse a él, debido a su mezcla de orientación a objetos y optimización entretejida. Pero esto lo hace sorprendentemente rápido (definitivamente supera a R para mí) y muchas de las cosas se pueden implementar en unas pocas líneas y luego todavía se beneficiarán de estas optimizaciones. Lo que lo hace reutilizable es la arquitectura modular. He escrito una función de distancia personalizada, y puedo utilizarla en todos los algoritmos, y he escrito un algoritmo en el que se pueden introducir funciones de distancia arbitrarias. He intentado estas cosas en R antes, pero o bien el módulo estaba limitado a las distancias euclidianas y tal, o necesitaría una matriz de distancia en la memoria, que toma $\mathcal{O}(n^2)$ memoria y tiempo. Además, al final puedo hacer miles de combinaciones distancia+algoritmo+índice para comparar y ver si mi nuevo material sirve para algo. Por ejemplo, aprendí de esta manera que la distancia de Canberra funciona sorprendentemente bien en una serie de escenarios, y a menudo sería una opción mucho mejor que la distancia euclidiana.
Por otro lado, hay mucho código en la red que es una mierda . Estaba buscando el algoritmo de clustering OPTICS. He encontrado versiones en Matlab y Python: http://chemometria.us.edu.pl/download/optics.py pero ambos eran una mierda. Lento, y el resultado era esencialmente un resultado DBSCAN. OPTICS en Weka tiene una bonita vista de la trama, pero no agrupa realmente, y es increíblemente lento. La versión ELKI de OPTICS era una liga completamente diferente. Me imagino que alguien simplemente volcó lo que había llegado, pero el código nunca fue revisado o incluso probado adecuadamente. La versión de python aparentemente está basada en la versión de Matlab, que tal vez fue transcrita de la versión incompleta de Weka. ¡Ouch!