当前位置: 首页 > 科技观察

机器学习K-means算法Python实现

时间:2023-03-20 13:48:27 科技观察

K-means算法介绍K-means是机器学习中常用的算法。指定簇数,让它自动将数据聚合到多个类别中。同一簇内的数据相似度高,不同簇内的数据相似度低。K-menas的优缺点:优点:原理简单,速度快。它对大数据集有很好的可扩展性。缺点:需要指定簇数K。对异常值敏感,对初值敏感。K-均值聚类过程的聚类过程类似于梯度下降算法,建立成本函数,并通过迭代使成本函数的价值越来越小,以正确选择C类的初始中心;在第k次迭代中,对于任意样本,求其到c个中心的距离,将样本归类到距离最短的中心所在的类;使用均值等方法更新类的中心值;对于所有的c个簇中心,如果采用(2)(3)的迭代方法更新,值保持不变变化,则迭代结束,否则继续迭代。该算法最大的优点是简单和快速。算法的关键在于初始中心的选择和距离公式。K-means示例显示了km在python中的一些参数:sklearn.cluster.KMeans(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')n_clusters:簇的个数,也就是要聚多少类init:初始簇中心的获取方法n_init:获取初始聚类中心的变化次数,为了补偿初始质心的影响,算法会默认初始化10个质心,执行算法,然后返回最好的结果。max_iter:***迭代次数(因为kmeans算法的实现需要迭代)tol:Tolerance,即kmeans运算准则收敛的条件True会将整个距离矩阵放入内存,auto会默认为当数据样本数大于featurs*samples大于12e6时为false,False的核心实现方式是用Cpython实现verbose:verbose模式(不懂什么意思,默认值一般不是anywaychanged)random_state:随机生成聚类中心的状态条件。copy_x:是否修改数据的标志,如果为True,即复制后数据不会被修改。bool在scikit-learn的很多接口中都有这个参数,即是否继续复制输入数据,以免修改用户的输入数据。如果你了解Python的内存机制,这一点会更清楚。n_jobs:parallelsettingalgorithm:kmeans的实现算法,包括:'auto','full','elkan',其中'full'表示虽然EM实现的参数很多,但是已经给出了默认值。所以我们一般不需要传入这些参数,参数。可以根据实际需要调用。Thefollowingshowsacodeexamplefromsklearn.clusterimportKMeansfromsklearn.externalsimportjoblibfromsklearnimportclusterimportnumpyasnp#Generate10*3matrixdata=np.random.rand(10,3)printdata#Clusteringinto4categoriesestimator=KMeans(n_clusters=4)#fit_predictmeansfitting+Predictioncanalsobewrittenseparatelyres=estimator.fit_predict(data)#predictedcategorylabelresultlable_pred=estimator.labels_#clustercentervalueofeachcategorycentroids=estimator.cluster_centers_#clustercentermeanvaluevectorsumofinertia=estimator.inertia_printlable_predprintcentroidsprintinertia代码执行结果[0210220320][[0.30283480.251830960.62493622][0.884812870.708918130.79463764][0.668219610.548172070.30197415][0.116299040.856849030.7088385]]0.570794546829为了更直观的描述,这次在图上做一个展示,由于图像上绘制二维Itismoreintuitive,sothedataisadjustedtotwodimensions,100pointsareselectedtodraw,andtheclusteringcategoryis3categoriesfromsklearn.clusterimportKMeansfromsklearn.externalsimportjoblibfromsklearnimportclusterimportnumpyasnpimportmatplotlib.pyplotaspltdata=np.random.rand(100,2)estimator=KMeans(n_clusters=3)res=estimator.fit_predict(data)lable_pred=estimator.labels_centroids=estimator.cluster_centers_inertia=estimator.inertia_#printresprintlable_predprintcentroidsprintinertiaforiinrange(len(data)):ifint(lable_pred[i])==0:plt.scatter(data[i][0],data[i][1],color='red')ifint(lable_pred[i])==1:plt.scatter(data[i][0],data[i][1],color='black')ifint(lable_pred[i])==2:plt.scatter(data[i][0],data[i][1],color='blue')plt.show()可以看到聚类效果还是不错的。对k-means的聚类效率进行了测试,将维度扩大到50维,对于最好的数据,拟合时间还是可以接受的,效率还是不错的。模型的存储与其他机器学习算法模型类似,来自sklearn.externalsimportjoblibjoblib.dump(km,"model/km_model.m")