python 代码实现k-means聚类分析的思路(不使用现成聚类库)


Posted in Python onJune 01, 2020

一、实验目标

1、使用 K-means 模型进行聚类,尝试使用不同的类别个数 K,并分析聚类结果。

2、按照 8:2 的比例随机将数据划分为训练集和测试集,至少尝试 3 个不同的 K 值,并画出不同 K 下 的聚类结果,及不同模型在训练集和测试集上的损失。对结果进行讨论,发现能解释数据的最好的 K 值。二、算法原理

首先确定k,随机选择k个初始点之后所有点根据距离质点的距离进行聚类分析,离某一个质点a相较于其他质点最近的点分配到a的类中,根据每一类mean值更新迭代聚类中心,在迭代完成后分别计算训 练集和测试集的损失函数SSE_train、SSE_test,画图进行分析。

python 代码实现k-means聚类分析的思路(不使用现成聚类库)

伪代码如下:

num=10 #k的种类
for k in range(1,num):
 随机选择k个质点
 for i in range(n): #迭代n次
 根据点与质点间的距离对于X_train进行聚类
 根据mean值迭代更新质点
 计算SSE_train
 计算SSE_test
画图

 算法流程图:

python 代码实现k-means聚类分析的思路(不使用现成聚类库)

三、代码实现

1、导入库

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split

2、计算距离

def distance(p1,p2):
 return np.sqrt((p1[0]-p2[0])**2+(p1[1]-p2[1])**2)

3、计算均值

def means(arr):
 return np.array([np.mean([p[0] for p in arr]),np.mean([p[1] for p in arr])])

4、二维数据处理

#数据处理
data= pd.read_table('cluster.dat',sep='\t',header=None) 
data.columns=['x']
data['y']=None
for i in range(len(data)): #遍历每一行 
 column = data['x'][i].split( ) #分开第i行,x列的数据。split()默认是以空格等符号来分割,返回一个列表 
 data['x'][i]=column[0] #分割形成的列表第一个数据给x列 
 data['y'][i]=column[1] #分割形成的列表第二个数据给y列
list=[]
list1=[]
for i in range(len(data)):
 list.append(float(data['x'][i]))
 list.append(float(data['y'][i]))
 list1.append(list)
 list=[]
arr=np.array(list1)
print(arr)

python 代码实现k-means聚类分析的思路(不使用现成聚类库)

5、划分数据集和训练集

#按照8:2划分数据集和训练集
X_train, X_test = train_test_split(arr,test_size=0.2,random_state=1)

6、主要聚类实现

count=10 #k的种类:1、2、3...10
SSE_train=[] #训练集的SSE
SSE_test=[] #测试集的SSE
n=20 #迭代次数
for k in range(1,count):
 cla_arr=[] #聚类容器
 centroid=[] #质点
 for i in range(k):
 j=np.random.randint(0,len(X_train))
 centroid.append(list1[j])
 cla_arr.append([])
 centroids=np.array(centroid) 
 cla_tmp=cla_arr #临时训练集聚类容器
 cla_tmp1=cla_arr #临时测试集聚类容器
 for i in range(n): #开始迭代
 for e in X_train: #对于训练集中的点进行聚类分析
 pi=0
 min_d=distance(e,centroids[pi]) 
 for j in range(k):
 if(distance(e,centroids[j])<min_d): 
  min_d=distance(e,centroids[j])
  pi=j
 cla_tmp[pi].append(e) #添加点到相应的聚类容器中
 
 for m in range(k):
 if(n-1==i):
 break
 centroids[m]=means(cla_tmp[m])#迭代更新聚类中心
 cla_tmp[m]=[]
 dis=0
 for i in range(k):  #计算训练集的SSE_train
 for j in range(len(cla_tmp[i])):
 dis+=distance(centroids[i],cla_tmp[i][j])
 SSE_train.append(dis)
 
 col = ['HotPink','Aqua','Chartreuse','yellow','red','blue','green','grey','orange'] #画出对应K的散点图
 for i in range(k):
 plt.scatter([e[0] for e in cla_tmp[i]],[e[1] for e in cla_tmp[i]],color=col[i])
 plt.scatter(centroids[i][0],centroids[i][1],linewidth=3,s=300,marker='+',color='black')
 plt.show()
 
 for e in X_test:  #测试集根据训练集的质点进行聚类分析
 ki=0
 min_d=distance(e,centroids[ki])
 for j in range(k):
 if(distance(e,centroids[j])<min_d):
 min_d=distance(e,centroids[j])
 ki=j
 cla_tmp1[ki].append(e)
 for i in range(k):  #计算测试集的SSE_test
 for j in range(len(cla_tmp1[i])):
 dis+=distance(centroids[i],cla_tmp1[i][j])
 SSE_test.append(dis)

python 代码实现k-means聚类分析的思路(不使用现成聚类库)

7、画图

SSE=[] #计算测试集与训练集SSE的差值
for i in range(len(SSE_test)):
 SSE.append(SSE_test[i]-SSE_train[i])

x=[1,2,3,4,5,6,7,8,9]
plt.figure()
plt.plot(x,SSE_train,marker='*')
plt.xlabel("K")
plt.ylabel("SSE_train")
plt.show() #画出SSE_train的图

plt.figure()
plt.plot(x,SSE_test,marker='*')
plt.xlabel("K")
plt.ylabel("SSE_test")
plt.show() #画出SSE_test的图

plt.figure()
plt.plot(x,SSE,marker='+')
plt.xlabel("K")
plt.ylabel("SSE_test-SSE_train")
plt.show() #画出SSE_test-SSE_train的图

python 代码实现k-means聚类分析的思路(不使用现成聚类库)

python 代码实现k-means聚类分析的思路(不使用现成聚类库)

四、实验结果分析

可以看出SSE随着K的增长而减小,测试集和训练集的图形趋势几乎一致,在相同的K值下,测试集的SSE大于训练集的SSE。于是我对于在相同的K值下的SSE_test和SSE_train做了减法(上图3),可知K=4时数据得出结果最好。这里我主要使用肘部原则来判断。本篇并未实现轮廓系数,参考文章:https://3water.com/article/187771.htm

总结

到此这篇关于python 代码实现k-means聚类分析(不使用现成聚类库)的文章就介绍到这了,更多相关python k-means聚类分析内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python用来获得图片exif信息的库实例分析
Mar 16 Python
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
浅析python递归函数和河内塔问题
Apr 18 Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
Python双链表原理与实现方法详解
Feb 22 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
基于Python把网站域名解析成ip地址
May 25 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
Jun 17 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 Python
python如何写出表白程序
Jun 01 #Python
python中os包的用法
Jun 01 #Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 #Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 #Python
浅谈pycharm导入pandas包遇到的问题及解决
Jun 01 #Python
python实现密码验证合格程序的思路详解
Jun 01 #Python
Python网络爬虫四大选择器用法原理总结
Jun 01 #Python
You might like
在PHP的图形函数中显示汉字
2006/10/09 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
JavaScript DOM 添加事件
2009/02/14 Javascript
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
详解使用python crontab设置linux定时任务
2016/12/08 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
python ---lambda匿名函数介绍
2019/03/13 Python
python中正则表达式与模式匹配
2019/05/07 Python
python for和else语句趣谈
2019/07/02 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
大学生村官考核材料
2014/05/23 职场文书
学习党代会心得体会
2014/09/05 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书