一、简介
K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
二、
1.便于理解,首先创建一个明显分为2类20*2的例子(每一列为一个变量共2个变量,每一行为一个样本共20个样本):

import numpy as np
c1x=np.random.uniform(0.5,1.5,(1,10))
c1y=np.random.uniform(0.5,1.5,(1,10))
c2x=np.random.uniform(3.5,4.5,(1,10))
c2y=np.random.uniform(3.5,4.5,(1,10))
x=np.hstack((c1x,c2x))
y=np.hstack((c2y,c2y))
X=np.vstack((x,y)).T
print(X)

结果:
[[1.4889993 4.18741329]
[0.73017615 4.07842216]
[1.15522846 4.05744838]
[1.40768457 3.76674812]
[1.376212 3.95063903]
[1.20821055 4.34138767]
[0.73898392 3.55026013]
[0.97116627 3.65432314]
[0.98267302 4.16731561]
[1.06346541 4.44383585]
[4.10945954 4.18741329]
[3.75288064 4.07842216]
[4.29638229 4.05744838]
[3.95221785 3.76674812]
[4.09826192 3.95063903]
[4.04840874 4.34138767]
[4.29594009 3.55026013]
[3.56931245 3.65432314]
[3.57962941 4.16731561]
[3.65208848 4.44383585]]

  1. 引用Python库将样本分为两类(k=2),并绘制散点图:
    #只需将X修改即可进行其他聚类分析
import matplotlib.pyplot as plt
from sklearn.cluster import KMeanskemans=KMeans(n_clusters=2)
result=kemans.fit_predict(X) #训练及预测
print(result)   #分类结果plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei'] #散点图标签可以显示中文x=[i[0] for i in X]
y=[i[1] for i in X]
plt.scatter(x,y,c=result,marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

结果:
[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]

  1. 如果K值未知,可采用肘部法选择K值(假设最大分类数为9类,分别计算分类结果为1-9类的平均离差,离差的提升变化下降最抖时的值为最优聚类数K):
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdistK=range(1,10)
meanDispersions=[]
for k in K:kemans=KMeans(n_clusters=k)kemans.fit(X)#计算平均离差m_Disp=sum(np.min(cdist(X,kemans.cluster_centers_,'euclidean'),axis=1))/X.shape[0]meanDispersions.append(m_Disp)plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei'] #使折线图显示中文plt.plot(K,meanDispersions,'bx-')
plt.xlabel('k')
plt.ylabel('平均离差')
plt.title('用肘部方法选择K值')
plt.show()

三、实例分析(对某网站500家饭店价格及评论进行聚类)

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt
import pandas as pddata=pd.read_excel('data.xlsx',header=0).iloc[:501,3:5]
per_25=data.describe().iloc[4,1]
per_75=data.describe().iloc[6,1]
data=data[(data.iloc[:,1]>=per_25)&(data.iloc[:,1]<=per_75)] #选择位于四分位数之内的数
X=np.array(data)K=range(1,10)
meanDispersions=[]
for k in K:kemans=KMeans(n_clusters=k)kemans.fit(X)meanDispersions.append(sum(np.min(cdist(X,kemans.cluster_centers_,'euclidean'),axis=1))/X.shape[0])plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(K,meanDispersions,'bx-')
plt.xlabel('k')
plt.ylabel('平均离差')
plt.title('用肘部方法选择K值')
plt.show()具体聚类过程from sklearn.cluster import KMeans
import matplotlib.pyplot as pltkemans=KMeans(n_clusters=3)
result=kemans.fit_predict(X)
print(result)
x=[i[0] for i in X]
y=[i[1] for i in X]
plt.scatter(x,y,c=result,marker='o')
plt.xlabel('avgPrice')
plt.ylabel('llCommentNum')
plt.title('对500家饭店价格与评论数进行聚类')

聚类结果:
[2 0 0 0 0 1 0 0 2 0 0 2 1 2 0 1 2 0 2 2 2 0 0 0 0 1 2 0 1 0 0 2 2 2 2 2 2
2 2 0 1 0 0 0 1 0 2 2 0 2 2 0 0 2 2 2 1 0 1 1 1 0 0 0 0 1 2 1 2 0 2 1 0 0
2 1 1 0 0 1 2 2 0 2 2 1 0 2 1 0 2 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 2 1 2 1
1 0 0 1 0 1 2 1 0 1 1 0 1 1 0 1 0 2 1 1 0 1 0 2 0 2 1 2 1 1 0 0 1 0 1 0 1
0 2 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 2 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1
2 0 1 1 2 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 2 0 1 1 1 2 2 0 0 2 1 1 2 1 1 1 0
1 1 0 1 2 2 0 2 2 2 0 1 0 1 1 2 1 1 1 0 1 1 1 1 0 0 0 0 1]

数学建模——K-means聚类模型Python代码相关推荐

  1. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  2. 数学建模学习笔记——聚类模型

    一开始选择的聚类中心不一样,最后的聚类效果不同 求均值 spss默认的是k均值++的算法  K-means和K--means++无法确定k   K越大-->J越小 密度聚类

  3. 数学建模:整数规划示例模型 (Python 求解)

    目录 例 1 : 选课策略模型 1. 为了选修课程门数最少, 应学习哪些课程? 建立 0-1 规划模型 Python 求解 2. 选修课程最少时, 为了学分尽量多, 应学习哪些课程? 例 2 : 装箱 ...

  4. 数学建模之:匈牙利算法python代码

    from scipy.optimize import linear_sum_assignmentcost =np.array([[4,1,3],[2,0,5],[3,2,2]]) row_ind,co ...

  5. k均值聚类的python代码_k-均值聚类Python代码实现

    这里给出两种方式的k-均值实现,code主要来自于网络: # reference: https://mubaris.com/2017/10/01/kmeans-clustering-in-python ...

  6. Python小白的数学建模课-09.微分方程模型

    小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型的建模与求解,通过常微分方程.常微分方程组.高阶常微分方程 3个案例手 ...

  7. 数学建模——TOPSIS综合评价模型Python代码

    数学建模--TOPSIS综合评价模型Python代码 正常代码 import numpy as np # 导入numpy包并将其命名为np ##定义正向化的函数 def positivization( ...

  8. 【Python数学建模】SEIR传染病模型模型延伸-SEIDR模型(一),加入疫苗接种、政府管控、病毒变异等因素的影响

    目录 一. SEIR传染病模型 二. SEIR模型的延伸--SEIDR模型 三. 模型延伸--影响因素1:疫苗接种 四. 模型延伸--影响因素2:政府管控 五. 模型延伸--影响因素3:病毒变异 写在 ...

  9. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

最新文章

  1. 孙正义的软银愿景宫斗内幕:印度裔高管争宠,黑公关手段,设局桃色仙人跳...
  2. Mediasoup简介及其基本概念
  3. Android中使用getDrawable时提示:Call requires API level 21(current min is 15)
  4. 浅谈OpenCL之Platform API(2)
  5. sshpass批量执行操作
  6. java程序a-z b-y,请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串,输出这个串加密后的结 - 赏学吧...
  7. cartographer的一些结果
  8. maven依赖的版本管理
  9. 两个最热门的BI软件:Tableau和Finereport
  10. 商业化游戏服务器引擎自定义框架设计思路
  11. OpenSSL Cipher 加密解密 Ruby on Rails
  12. 从高盛AI报告看国内智能语音翘楚 但没有科大讯飞
  13. 2018总结-店铺投资篇
  14. 计算机专业跨考为什么考不了,浙江大学计算机专业考研,为什么这么多跨考计算机...
  15. sql 中distinct和group by
  16. JavaScript下的setTimeout(fn,0)意味着什么?
  17. 怎么在电脑上用计算机,如何把旧电脑变成云电脑?戳这里
  18. 笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解
  19. Spring boot AML教程
  20. Linux下载文件命令wget的一些用法

热门文章

  1. yolov5论文叫什么_论文格式与论文查重到底是什么鬼?教你半小时搞定的独门技巧...
  2. linux 普通用户crond,linux下普通用户的定时任务
  3. 数据中心管理将成为未来十年所需的技能
  4. centos 开发php扩展,【PHP扩展】centos给PHP安装扩展
  5. 成功解决在excel表中通过数学函数转换后,接着去掉公式转为不再随着变化的数值
  6. DayDayUp:大学英语六级考试简介、应试分析、题型内容((Writing/Listening/Reading/Translation)、解答经验步骤、解题技巧之最强攻略(建议收藏)
  7. AI:2020年7月10日世界人工智能大会WAIC青少年人工智能创新发展论坛《人工智能从娃娃抓起》
  8. BigData之Hbase:Hbase数据管理的简介、下载、案例应用之详细攻略
  9. DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率
  10. 成功解决Python中出现的TypeError: object of type 'zip' has no len()