K-means算法对data中数据进行聚类分析

实验要求

    • K-means算法对data中数据进行聚类分析
  • 1. 算法原理描述
  • 2. 写出K-means具体功能函数
  • 3. 可视化画图,不同类数据采用不同颜色for item in range(k):
  • 4. 完整代码
  • 实验结果
  • 感想

1. 算法原理描述

K-means算法是一种典型的无监督学习聚类算法。
而算法的具体思想是这样的:

  1. 从数据集中选择k个样本作为初始均值向量且分别带上其簇标记
    (初始值的选择也是kmeans算法里的重要环节,但这里我首先尝试随机选择,可能在后续学习后会更新其他的方法)
  2. 计算每一个样本与k个均值向量的距离,并带上与它距离最小的均值向量的簇标记,并放入对应集合里
    (距离的计算也有很多方法,可能在后续学习后会更新其他的方法)
  3. 计算集合的新的均值向量,若与上一次均值向量不一致,跳转至第二步骤开启新的一轮迭代;若与上一轮均值向量相同,则跳出循环,并将此时的均值向量和分类好的k个簇作为结果输出;

2. 写出K-means具体功能函数

  • 载入数据:
def loadData(filename):infile = open(filename, 'r')x = []y = []for line in infile:trainningset = line.split(' ', 1)x.append(trainningset[0])trainningset[1] = trainningset[1].replace('\n','')y.append(trainningset[1])x = [np.double(item) for item in x]y = [np.double(item) for item in y]return x, y
  • 计算与簇中心的距离:
def distance(a,b,c,d):return pow(pow((a-c),2)+pow((b-d),2), 0.5)
  • 将每一个样本重新归类:
def iteration(k,meansx,meansy,x,y):while 1:Cx = [[] for i in range(k)]Cy = [[] for i in range(k)]ans = []finalmeansx = []finalmeansy = []for item in range(len(x)):mindis = 1000minindex = -1for ele in range(k):if distance(x[item],y[item],meansx[ele],meansy[ele]) < mindis:mindis = distance(x[item],y[item],meansx[ele],meansy[ele])minindex = eleans.append(minindex)Cx[minindex].append(x[item])Cy[minindex].append(y[item])for i in range(k):finalmeansx.append(np.mean(Cx[i]))finalmeansy.append(np.mean(Cy[i]))if finalmeansx == meansx and finalmeansy == meansy:breakelse:meansx = finalmeansxmeansy = finalmeansyreturn finalmeansx,finalmeansy,Cx,Cy,ans
  • kmeans主函数
def kmeans(k,x,y):meansx = random.sample(x, k)meansy = random.sample(y, k)print(meansx)print(meansy)finalmeansx,finalmeansy,Cx,Cy,ans = iteration(k,meansx,meansy,x,y)

3. 可视化画图,不同类数据采用不同颜色for item in range(k):

f = open("E:\query.txt",'a')
for item in range(k):f.write("第"+item.__str__()+"个簇:\n")f.write("均值中心为("+finalmeansx[item].__str__()+","+finalmeansy[item].__str__()+")\n")scatter(finalmeansx[item], finalmeansy[item],c=colors[item],marker='x')f.write("簇内元素有:"+len(Cx[item]).__str__()+"个\n")for i in range(len(Cx[item])):f.write("("+Cx[item][i].__str__()+","+Cy[item][i].__str__()+")\n")scatter(Cx[item][i],Cy[item][i],c=colors[item])

4. 完整代码

import matplotlib
import numpy as np
import random
from matplotlib.pyplot import plot, scattercolors=['b','c','g','k','m','r','y']
#因为最后需要不同颜色绘图,但python不是很精通,所以最后采取了手动变色(滑稽def loadData(filename):  #把数据导入infile = open(filename, 'r')x = []y = []for line in infile:trainningset = line.split(' ', 1)x.append(trainningset[0])trainningset[1] = trainningset[1].replace('\n','')#这里也是因为我的python技术不精,不知道为啥划分后trainningset[1]后多了换行符,只好手动切除了y.append(trainningset[1])x = [np.double(item) for item in x]y = [np.double(item) for item in y]return x, ydef distance(a,b,c,d): #最简单的距离计算方法哈!return pow(pow((a-c),2)+pow((b-d),2), 0.5)def iteration(k,meansx,meansy,x,y):
#kmeans的核心函数,找到最终的均值向量while 1:Cx = [[] for i in range(k)]Cy = [[] for i in range(k)]ans = []finalmeansx = []finalmeansy = []for item in range(len(x)):mindis = 1000minindex = -1for ele in range(k):if distance(x[item],y[item],meansx[ele],meansy[ele]) < mindis:mindis = distance(x[item],y[item],meansx[ele],meansy[ele])minindex = eleans.append(minindex)Cx[minindex].append(x[item])Cy[minindex].append(y[item])for i in range(k):finalmeansx.append(np.mean(Cx[i]))finalmeansy.append(np.mean(Cy[i]))if finalmeansx == meansx and finalmeansy == meansy:breakelse:meansx = finalmeansxmeansy = finalmeansyreturn finalmeansx,finalmeansy,Cx,Cy,ansdef kmeans(k,x,y):meansx = random.sample(x, k)meansy = random.sample(y, k)print(meansx)print(meansy)finalmeansx,finalmeansy,Cx,Cy,ans = iteration(k,meansx,meansy,x,y)#修改后代码:f = open("E:\query.txt",'a')for item in range(k):f.write("第"+item.__str__()+"个簇:\n")f.write("均值中心为("+finalmeansx[item].__str__()+","+finalmeansy[item].__str__()+")\n")scatter(finalmeansx[item], finalmeansy[item],c=colors[item],marker='x')f.write("簇内元素有:"+len(Cx[item]).__str__()+"个\n")for i in range(len(Cx[item])):f.write("("+Cx[item][i].__str__()+","+Cy[item][i].__str__()+")\n")scatter(Cx[item][i],Cy[item][i],c=colors[item])"""#以下就是在输出框输出分类结果for item in range(k):print("第"+item.__str__()+"个簇:\n")print("均值中心为("+finalmeansx[item].__str__()+","+finalmeansy[item].__str__()+")\n")#最终簇中心用x突显scatter(finalmeansx[item], finalmeansy[item],c=colors[item],marker='x')print("簇内元素有:"+len(Cx[item]).__str__()+"个\n")for i in range(len(Cx[item])):print("("+Cx[item][i].__str__()+","+Cy[item][i].__str__()+")\n")#画散点图scatter(Cx[item][i],Cy[item][i],c=colors[item])"""datax,datay = loadData("E:\data.txt")
k = int(input("请问需要分为几类:"))
kmeans(k,datax,datay)
#刚开始不知道为什么不弹出画图框,后来加了这个就出来啦
matplotlib.pyplot.figure(1)
matplotlib.pyplot.show()

实验结果

(应该要把它导出到文件里的,再去修改修改!)
改好了!
(又学到了!开心!)
将最后的数据生成txt文件存在了E盘里:

感想

  • 其实之前只有在计算方法课上用过一段时间python,并没有自己主动地深入地学习过python,而对于数据处理和可视化,python有着其独特优势,希望在之后能够更多地学习了解python。
  • 这次实验其实写的python代码很冗余,希望以后了解更多后能够加以修改!
  • 先在E盘里找,找不到就自动创建
f = open("E:\query.txt",'a')

有问题的地方希望各位加以指正!

K-means算法实现及分析相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  3. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  4. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  5. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

  6. 为了联盟还是为了部落 | K means

    1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...

  7. 刻意练习:机器学习实战 -- Task01. K邻近算法

    背景 这是我们为拥有 Python 基础的同学推出的精进技能的"机器学习实战" 刻意练习活动,这也是我们本学期推出的第三次活动了. 我们准备利用8周时间,夯实机器学习常用算法,完成 ...

  8. K近邻算法:以同类相吸解决分类问题!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:游璐颖,福州大学,Datawhale成员 前言 KNN(k-nea ...

  9. k近邻算法api初步使用

    k近邻算法api初步使用 机器学习流程复习: 1.获取数据集 2.数据基本处理 3.特征工程 4.机器学习 5.模型评估 1 Scikit-learn工具介绍 Python语言的机器学习工具 Scik ...

  10. K近邻算法(KNN)原理小结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目录 1. KNN算法原理 2. KNN算法三要素 3. KNN算 ...

最新文章

  1. Java 读取 dwg 转换 dxf
  2. 和自己和解:方法的借鉴level
  3. wordpress插件翻译不生效_新的恶意软件利用wordpress插件漏洞攻击数百万网站
  4. ArcGIS Engine 10 开发常见问题的解决方法
  5. 征战蓝桥 —— 2018年第九届 —— C/C++B组第1题——第几天
  6. 视图、存储函数、存储过程、触发器:MySQL系列之五
  7. 网络流--最大流--HDU 3549 Flow Problem
  8. c构造函数和析构函数_C ++构造函数,析构函数能力问题和答案(第2组)
  9. OpecCV颜色分割
  10. 百度糯米android面试题,【百度百度糯米队列百度编程基础数据安全面试题】面试问题:编程:使用C实… - 看准网...
  11. Mysql数据库查询优化日常笔记
  12. html 系统评分样式,前端开发-星级评分系统
  13. mysql sock_mysql.sock 文件解析
  14. 机房动力环境监测系统
  15. 蓝牙资讯|Q2全球TWS耳机出货量排行出炉,蓝牙音频新技术将推出市场
  16. python打印N*N乘法表
  17. dfasdfad大发
  18. 【企业架构设计实战】2 业务架构设计
  19. MAYA简单操作讲解1--入门干货
  20. Android_插值器

热门文章

  1. 二进制计算机课教案,《二进制与计算机》教学设计
  2. 核定征收的个体户,年营业额不超过120万,还需要缴纳个税吗?
  3. java抖音字符视频_代码生成抖音文字视频
  4. 多传感器融合定位开源工程与论文
  5. idea社区版创建springboot_IDEA社区版创建spring boot项目的安装插件的图文教程
  6. matlab 把连续函数离散,连续传递函数离散化
  7. 正态总体的样本均值与样本方差的分布定理
  8. 带孔的打印纸怎么设置_针式打印机纸张的格式大小该怎么设置?
  9. word插入脚注后最后一页多了一个分页符(下一页),导致最后多了一个空白页,删除不掉。
  10. 一键去“码”的AI,还能认出带上口罩的脸