K-means算法又称为k均值算法,K-means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。

其算法思想大致为:先从样本集中随机选取 k个样本作为簇中心,并计算所有样本与这 k个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。距离的计算采用欧氏距离作为标准,欧氏距离计算公式如下:

根据以上描述,我们大致可以猜测到实现K-means算法的主要四点:

(1)簇个数 k 的选择。

(2)各个样本点到“簇中心”的距离。

(3)根据新划分的簇,更新“簇中心”。

(4)重复上述2、3过程,直至"簇中心"没有移动。

实验设计过程中需要用到 Sklearn中的 K-Means算法,取数据集中前k个点作为初始中心,从样本中随机取k个点做初始聚类中心,设置随机数种子,待聚类样本目标聚成三类,在其中选取三个随机点;对每个样本,找到距离自己最近的中心点,完成一次聚类,判断此次聚类前后样本点的聚类情况是否相同,若相同,算法终止,否则继续下一步并根据本次聚类结果更新中心点;接下来循环进行判断直到与此次聚类前样本点的聚类情况是否相同,若相同,算法终止,同时返回迭代误差以及最终群集中心。最后通过Axes3D和Matplotlib两个库将数据以图像的方式输出出来。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeansdef InitCenter(k,m,x_train):Center = np.random.randn(k,n)Center = np.array(x_train.iloc[0:k,:]) #取数据集中前k个点作为初始中心Center = np.zeros([k,n])         #从样本中随机取k个点做初始聚类中心np.random.seed(15)            #设置随机数种子for i in range(k):x = np.random.randint(m)Center[i] = np.array(x_train.iloc[x])return Center
def GetDistense(x_train, k, m, Center):Distence=[]for j in range(k):for i in range(m):x = np.array(x_train.iloc[i, :])a = x.T - Center[j]Dist = np.sqrt(np.sum(np.square(a)))Distence.append(Dist)Dis_array = np.array(Distence).reshape(k,m)return Dis_array
def GetNewCenter(x_train,k,n, Dis_array):cen = []axisx ,axisy,axisz= [],[],[]cls = np.argmin(Dis_array, axis=0)for i in range(k):train_i=x_train.loc[cls == i]xx,yy,zz = list(train_i.iloc[:,1]),list(train_i.iloc[:,2]),list(train_i.iloc[:,3])axisx.append(xx)axisy.append(yy)axisz.append(zz)meanC = np.mean(train_i,axis=0)cen.append(meanC)newcent = np.array(cen).reshape(k,n)NewCent=np.nan_to_num(newcent)return NewCent,axisx,axisy,axisz
def KMcluster(x_train,k,n,m,threshold):global axis_x, axis_ycenter = InitCenter(k,m,x_train)initcenter = centercenterChanged = Truet=0while centerChanged:Dis_array = GetDistense(x_train, k, m, center)center ,axis_x,axis_y,axis_z= GetNewCenter(x_train,k,n,Dis_array)err = np.linalg.norm(initcenter[-k:] - center)t+=1print('err of Iteration '+str(t),'is',err)plt.figure(1)p=plt.subplot(2, 3, t)p1,p2,p3 = plt.scatter(axis_x[0], axis_y[0], c='r'),plt.scatter(axis_x[1], axis_y[1], c='g'),plt.scatter(axis_x[2], axis_y[2], c='b')plt.legend(handles=[p1, p2, p3], labels=['0', '1', '2'], loc='best')p.set_title('Iteration'+ str(t))if err < threshold:centerChanged = Falseelse:initcenter = np.concatenate((initcenter, center), axis=0)plt.show()return center, axis_x, axis_y,axis_z, initcenterif __name__=="__main__":x=pd.read_csv("C:/iris.csv")x_train=x.iloc[:,1:5]m,n = np.shape(x_train)k = 3threshold = 0.1km,ax,ay,az,ddd = KMcluster(x_train, k, n, m, threshold)print('Final cluster center is ', km)#2-Dplotplt.figure(2)plt.scatter(km[0,1],km[0,2],c = 'r',s = 550,marker='x')plt.scatter(km[1,1],km[1,2],c = 'g',s = 550,marker='x')plt.scatter(km[2,1],km[2,2],c = 'b',s = 550,marker='x')p1, p2, p3 = plt.scatter(axis_x[0], axis_y[0], c='r'), plt.scatter(axis_x[1], axis_y[1], c='g'), plt.scatter(axis_x[2], axis_y[2], c='b')plt.legend(handles=[p1, p2, p3], labels=['0', '1', '2'], loc='best')plt.title('2-D scatter')plt.show()#3-Dplotplt.figure(3)TreeD = plt.subplot(111, projection='3d')TreeD.scatter(ax[0],ay[0],az[0],c='r')TreeD.scatter(ax[1],ay[1],az[1],c='g')TreeD.scatter(ax[2],ay[2],az[2],c='b')TreeD.set_zlabel('Z') # 坐标轴TreeD.set_ylabel('Y')TreeD.set_xlabel('X')TreeD.set_title('3-D scatter')plt.show()

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近邻算法

    23.k-近邻算法以及案例预测入住位置 24.K-近邻算法案例 分类算法-k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本 ...

  5. k近邻算法(KNN)-分类算法

    k近邻算法(KNN)-分类算法 1 概念 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. k-近邻算法采用测量不同特征值之间的 ...

  6. K means 图片压缩

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

  7. k均值聚类算法考试例题_k means聚类算法实例

    所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高.其中每个子集叫做一个簇. ...

  8. k邻近算法(KNN)实例

    一 k近邻算法原理 k近邻算法是一种基本分类和回归方法. 原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实 ...

  9. 机器学习之K近邻算法原理+应用实例

    1. 基本原理 K最近邻(K-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,其基本思路与"近朱者赤,近墨者黑"的原理类似,当对未分类样本进行分类时, ...

  10. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

最新文章

  1. Nginx配置使用积累[不断更新]
  2. SparkSQL之关联mysql和hive查询
  3. debug error怎么解决_我要以血和泪的经历告诉你,这个 bug 太难解决了
  4. ssh+json开发实例
  5. 微软Azure、谷歌GAE、亚马逊AWS比較
  6. js之类 面向对象的书写方式(详细篇)
  7. java数组函数_Java数组
  8. 北京自贸区国际商务服务片区挂牌 总面积48平方公里
  9. SpringAop实现原理
  10. QQ群排名霸屏:快速上排名方法
  11. mysql崩 数据同步_MySQL5.7 大大降低了半同步复制-数据丢失的风险
  12. 什么是语法糖(Syntactic sugar)?
  13. 毕业论文中的“自动生成目录”设置(经验四)
  14. html5动态画图,HTML5使用Canvas动态绘制心型线和玫瑰线的教程
  15. [计算机网络] 域名系统
  16. oracle基础|oracle多表查询用法|什么是等值连接(inner join)|什么是不等值连接(between)|什么是左连接(left join)|什么是右连接(right join)
  17. 海康视频VTM流监控浏览器实时播放调试总结
  18. phpstorm 使用指南
  19. Final Cut Pro 一篇入门(没废话、干货)
  20. JavaIO流概念详解

热门文章

  1. 四个要诀提升个人执行力
  2. 软件测试|Python操作Excel制作报表,不要太方便
  3. MySQL Cluste(入门篇)—分布式数据库集群搭建
  4. (翻译)承诺与一致原理(Commitment consistency)
  5. 内连接与外连接的时候场景
  6. 月薪集中在8k-17k、厌倦大小周、近三成的人没有跳槽过,中国开发者调查报告发布
  7. win10系统设置开机网络自动连接的方法
  8. Lum Proxy的主要功能以及优缺点剖析
  9. 7-5 悄悄关注 (25 分) 新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列
  10. HTML5 : 文件上传下载