@@ -613,11 +613,11 @@ def fastermsc(diss, medoids, max_iter=100, init="random", random_state=None):
613613 return KMedoidsResult (* _fastermsc_f64 (diss , medoids .astype (np .uint64 ), max_iter ))
614614 raise ValueError ("Input data not supported. Use a numpy array of floats." )
615615
616- def dynmsc (diss , medoids , max_iter = 100 , init = "random" , random_state = None ):
616+ def dynmsc (diss , medoids , minimum_k = 2 , max_iter = 100 , init = "random" , random_state = None ):
617617 """DynMSC clustering
618618
619619 This is a version of FasterMSC with automatic cluster number selection, that
620- performs FasterMSC for k = 2 to the number of input medoids and returns
620+ performs FasterMSC for a minimum k to the number of input medoids and returns
621621 the clustering with the highest Average Medoid Silhouette.
622622
623623 References:
@@ -636,6 +636,8 @@ def dynmsc(diss, medoids, max_iter=100, init="random", random_state=None):
636636 :type max_iter: int
637637 :param init: initialization method
638638 :type init: str, "random", "first" or "build"
639+ :param minimum_k: minimum number of clusters to find
640+ :type minimum_k: int
639641 :param random_state: random seed if no medoids are given
640642 :type random_state: int, RandomState instance or None
641643
@@ -650,12 +652,14 @@ def dynmsc(diss, medoids, max_iter=100, init="random", random_state=None):
650652
651653 medoids = _check_medoids (diss , medoids , init , random_state )
652654
655+ if medoids .shape [0 ] < minimum_k :
656+ raise ValueError ("Maximum k should be at least minimum k." )
653657 if isinstance (diss , np .ndarray ):
654658 dtype = diss .dtype
655659 if dtype == np .float32 :
656- return DynkResult (* _dynmsc_f32 (diss , medoids .astype (np .uint64 ), max_iter ))
660+ return DynkResult (* _dynmsc_f32 (diss , medoids .astype (np .uint64 ), minimum_k , max_iter ))
657661 elif dtype == np .float64 :
658- return DynkResult (* _dynmsc_f64 (diss , medoids .astype (np .uint64 ), max_iter ))
662+ return DynkResult (* _dynmsc_f64 (diss , medoids .astype (np .uint64 ), minimum_k , max_iter ))
659663 raise ValueError ("Input data not supported. Use a numpy array of floats." )
660664
661665def alternating (diss , medoids , max_iter = 100 , init = "random" , random_state = None ):
@@ -933,7 +937,7 @@ def fit(self, X, y=None):
933937 elif self .method == "fastermsc" :
934938 result = fastermsc (X , self .n_clusters , self .max_iter , self .init , random_state = self .random_state )
935939 elif self .method == "dynmsc" :
936- result = dynmsc (X , self .n_clusters , self .max_iter , self .init , random_state = self .random_state )
940+ result = dynmsc (X , self .n_clusters , 2 , self .max_iter , self .init , random_state = self .random_state )
937941 elif self .method == "fastmsc" :
938942 result = fastmsc (X , self .n_clusters , self .max_iter , self .init , random_state = self .random_state )
939943 elif self .method == "pamsil" :
0 commit comments