python——k-means算法

python——k-means算法,第1张

概述1.scikit-learn库实现K-means算法importpandasaspdfromsklearn.clusterimportKMeansimportmatplotlib.pyplotasplt"通过pandas导入相关数据"df=pd.read_csv(r'C:\Users\Administrator\Desktop\三年5000车\起点最多城市切分\8-删除异常运输链.csv',encoding=&quot

1.scikit-learn库实现K-means算法

import pandas as pdfrom sklearn.cluster import KMeansimport matplotlib.pyplot as plt"通过pandas导入相关数据"df = pd.read_csv(r'C:\Users\administrator\Desktop\三年5000车\起点最多城市切分-删除异常运输链.csv',enCoding="GB2312")x = df[['途径城市数量(不重复城市)','途经省份数量','里程','复杂度']]   #选择聚类的指标"超参数"k = 5"训练模型"model = KMeans(n_clusters=k,        #簇的个数,即你想聚成几类     init='k-means++',              #初始簇中心的获取方法    n_init=10,                      #获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10个质心,实现算法,然后返回最好的结果。    max_iter=300,                   #最大迭代次数(因为kmeans算法的实现需要迭代)    tol=0.0001,                     # 容忍度,即kmeans运行准则收敛的条件    precompute_distances='auto',    #是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用cpython 来实现的    verbose=0,                      # 冗长模式    random_state=None,              #随机生成簇中心的状态条件。    copy_x=True,                    #对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy  *** 作,以便不修改用户的输入数据。    n_jobs=1,                       #并行设置    algorithm='auto'                #kmeans的实现算法,有:’auto’, ‘full’, ‘elkan’, 其中 ‘full’表示用EM方式实现)km = model.fit(x)                   #进行聚类df['聚类结果'] = km.labels_         #km.labels_  获得聚类标签(数字形式)result = model.predict(x)           #可以用来获得聚类标签,也可以用来预测新数据centers = model.cluster_centers_    #获得簇的中心点坐标"结果可视化(聚类指标少于等于三个指标时可用)"plt.rcParams['Font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号"三个聚类指标时"ax = plt.axes(projection='3d')#中心点颜色标记mark4 = ['b','g','r','k']mark5 = ['b','g','r','k','y',]mark6 = ['b','g','r','k','y','c']mark7 = ['b','g','r','k','y','c','m']#画出各个数据点,用不同颜色表示分类for x,y,z,c in zip(df['载重'],df['总里程'],df['途经省份数量'],df['聚类结果']):        ax.scatter3D(x,y,z,color = mark5[c])#画出中心点,用不同颜色表示分类for j, center in enumerate(centers):    ax.scatter3D(center[0], center[1],center[2],color = mark5[j])ax.set_xlabel('途径城市数量')ax.set_ylabel('途经省份数量')ax.set_zlabel('趟次里程')"两个聚类指标时"#画出中心点for i, center in enumerate(centers):    plt.scatter(center[0],center[1],color = mark5[i])plt.xlabel('途经省份数量')plt.ylabel('总里程')plt.show()

2.聚类数量效果评估

(1)肘方法(拐点处为聚类效果最好的聚类数量)

import numpy as npfrom sklearn.cluster import KMeansimport matplotlib.pyplot as pltimport pandas as pd#读取数据df = pd.read_csv(r"H:\数据处理结果\三年数据合并.csv",enCoding="GB2312")X = df[['途径城市数量(不重复城市)','途经省份数量','里程','复杂度']]   #X为DataFrame数据X = np.array(X)     #转换成numpy array,否则在 X[group,:] 处会报错,或者改成X[group]distance = []k = []#簇的数量for n_clusters in range(1,10):    cls = KMeans(n_clusters).fit(X)    #曼哈顿距离    def manhattan_distance(x,y):        return np.sum(abs(x-y))    distance_sum = 0    for i in range(n_clusters):        group = cls.labels_ == i        members = X[group,:]        for v in members:            distance_sum += manhattan_distance(np.array(v), cls.cluster_centers_[i])    distance.append(distance_sum)    k.append(n_clusters)plt.scatter(k, distance)plt.plot(k, distance)plt.xlabel("k")plt.ylabel("distance")plt.show()

(2)轮廓系数(数值越高,聚类效果越好)

from sklearn.cluster import KMeansimport pandas as pdfrom sklearn.metrics import silhouette_scoreimport matplotlib.pyplot as pltdf = pd.read_csv(r"D:\数据\货运数据\中心城市切分运输链\三年数据00辆车抽样00辆车抽样-1.csv",enCoding="GB2312")X = df[['途径城市数量(不重复城市)','途经省份数量','里程','复杂度']]scores = []  # 存放轮廓系数for k in range(2,10):    kmeans = KMeans(n_clusters=k)  # 构造聚类器    kmeans.fit(X)    scores.append(silhouette_score(X,kmeans.labels_,metric='euclIDean'))X = range(2,10)plt.rcParams['Font.sans-serif'] = ['SimHei']plt.rcparams['axes.unicode_minus'] = Falseplt.xlabel('k值——簇数量')plt.ylabel('轮廓系数')plt.plot(X,scores,'o-')plt.show()

 

总结

以上是内存溢出为你收集整理的python——k-means算法全部内容,希望文章能够帮你解决python——k-means算法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1185157.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存