K-Means 工作原理 工作原理很简单:
选取 K 个点作为初始的类中心点,这些点一般都是从数据集中随机抽取的;
将每个点分配到最近的类中心点,这样就形成了 K 个类,然后重新计算每个类的中心点;
重复第二步,直到类不发生变化,或者你也可以设置最大迭代次数,这样即使类中心点发生变化,但是只要达到最大迭代次数就会结束。
使用 K-means 算法 1 2 3 from sklearn.cluster import KMeansKMeans(n_clusters=8 , init='k-means++' , n_init=10 , max_iter=300 , tol=0.0001 , precompute_distances='auto' , verbose=0 , random_state=None , copy_x=True , n_jobs=1 , algorithm='auto' )
们能看到在 K-Means 类创建的过程中,有一些主要的参数:
n_clusters : 即 K 值,一般需要多试一些 K 值来保证更好的聚类效果。你可以随机设置一些 K 值,然后选择聚类效果最好的作为最终的 K 值;
max_iter : 最大迭代次数,如果聚类很难收敛的话,设置最大迭代次数可以让我们及时得到反馈结果,否则程序运行时间会非常长;
n_init :初始化中心点的运算次数,默认是 10。程序是否能快速收敛和中心点的选择关系非常大,所以在中心点选择上多花一些时间,来争取整体时间上的快速收敛还是非常值得的。由于每一次中心点都是随机生成的,这样得到的结果就有好有坏,非常不确定,所以要运行 n_init 次, 取其中最好的作为初始的中心点。如果 K 值比较大的时候,你可以适当增大 n_init 这个值;
init: 即初始值选择的方式,默认是采用优化过的 k-means++ 方式,你也可以自己指定中心点,或者采用 random 完全随机的方式。自己设置中心点一般是对于个性化的数据进行设置,很少采用。random 的方式则是完全随机的方式,一般推荐采用优化过的 k-means++ 方式;
algorithm :k-means 的实现算法,有“auto” “full”“elkan”三种。一般来说建议直接用默认的”auto”。简单说下这三个取值的区别,如果你选择”full”采用的是传统的 K-Means 算法,“auto”会根据数据的特点自动选择是选择“full”还是“elkan”。我们一般选择默认的取值,即“auto” 。
在创建好 K-Means 类之后,就可以使用它的方法,最常用的是 fit 和 predict 这个两个函数。你可以单独使用 fit 函数和 predict 函数,也可以合并使用 fit_predict 函数。其中 fit(data) 可以对 data 数据进行 k-Means 聚类。 predict(data) 可以针对 data 中的每个样本,计算最近的类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from sklearn.cluster import KMeansfrom sklearn import preprocessingimport pandas as pdimport numpy as npdata = pd.read_csv('data.csv' , encoding='gbk' ) train_x = data[["2019 年国际排名 " ,"2018 世界杯 " ,"2015 亚洲杯 " ]] df = pd.DataFrame(train_x) kmeans = KMeans(n_clusters=3 ) min_max_scaler=preprocessing.MinMaxScaler() train_x=min_max_scaler.fit_transform(train_x) kmeans.fit(train_x) predict_y = kmeans.predict(train_x) result = pd.concat((data,pd.DataFrame(predict_y)),axis=1 ) result.rename({0 :u'聚类' },axis=1 ,inplace=True ) print(result)
K-means 聚类分割 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import numpy as npimport PIL.Image as imagefrom sklearn.cluster import KMeansfrom sklearn import preprocessingimport matplotlib.image as mpimgdef load_data (filePath) : f = open(filePath,'rb' ) data = [] img = image.open(f) width, height = img.size for x in range(width): for y in range(height): c1, c2, c3 = img.getpixel((x, y)) data.append([c1, c2, c3]) f.close() mm = preprocessing.MinMaxScaler() data = mm.fit_transform(data) return np.mat(data), width, height img, width, height = load_data('./weixin.jpg' ) kmeans =KMeans(n_clusters=2 ) kmeans.fit(img) label = kmeans.predict(img) label = label.reshape([width, height]) pic_mark = image.new("L" , (width, height)) for x in range(width): for y in range(height): pic_mark.putpixel((x, y), int(256 /(label[x][y]+1 ))-1 ) pic_mark.save("weixin_mark.jpg" , "JPEG" )
Last updated: 2019-02-24 03:51:23
Thanks for your reading :) | URL
https://joshuaqyh.github.io/2019/02/24/机器学习-kmeans-聚类/