scikit-learn K-Means "n_init" option not working

scikit-learn K-Means "n_init" option not working

Hi,

I have been using the K-Means clustering from scikit-learn with Intel Python (update 3) and I noticed that it seems to ignore the option "n_init". From the scikit-learn documentation, "n_init"  is the "Number of time the k-means algorithm will be run with different centroid seeds." I was wondering what the default value of "n_init" is (scikit-learn doc says 10).

To test this I ran the following:

from sklearn.cluster import KMeans
import numpy as np
from sklearn.datasets import fetch_mldata
import time
data = fetch_mldata('MNIST original').data
start = time.time()
kmeans = KMeans(n_clusters=64,n_init=1).fit(data)
print("n_init=1   : "+str(time.time()-start))
start = time.time()
kmeans = KMeans(n_clusters=64,n_init=10).fit(data)
print("n_init=10  : "+str(time.time()-start))
start = time.time()
kmeans = KMeans(n_clusters=64,n_init=1000).fit(data)
print("n_init=1000: "+str(time.time()-start))

This is the result I get (HW: Intel Xeon Phi processor 7210):

n_init=1   : 6.0663318634
n_init=10  : 4.0244550705
n_init=1000: 4.10864305496

I am guessing the first one is due to some sort of initialization. But the other "n_init"=10 and "n_init"=100 get the same performance. I know that K-Means can have different run-times based on how "lucky" the initial guess was, but I don't think "n_init"=10 and "n_init"=1000 would get the same performance even then. 

I tried creating an "init" array from the original dataset, and the performance I got with that makes me think that the default is "n_init"=1. But I can't seem to figure out what it is exactly (partly because "verbose=1" does not work either).

Thanks,
Ryo Asai
 

3 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

Hi, thank you for your interest to our optimizations for sklearn in Intel Distribution for Python.
I checked issue you report. You are right, I see that we skipped by mistake this option. It means that we use default DAAL's value there. DAAL's default value according documentation is 5. It will fixed as soon as possible in updates. 

If you want to disable our optimizations and enable original sklearn's behaviour you can do it with the following:

from sklearn.daal4sklearn import dispatcher
dispatcher.disable('KMeans')

Denis.

Hi Denis,

Thank you for the fast response!

- Ryo

Leave a Comment

Please sign in to add a comment. Not a member? Join today