k-means均值聚类

  1. 随机生成100个数,并对这100个数进行k-mean聚类(k=3,4)(并用matplot画图)。

1). 随机创建100个样本的二维数据作为训练集并画出训练样本的散点图

提示:

a. 使用 s k l e a r n sklearn sklearn的 m a k e _ b l o b s make\_blobs make_blobs方法来生成用于测试聚类算法的效果。 s k l e a r n sklearn sklearn中的 m a k e _ b l o b s make\_blobs make_blobs方法常被用来生成聚类算法的测试数据,直观地说, m a k e _ b l o b s make\_blobs make_blobs会根据用户指定的特征数量、中心点数量、范围等来生成几类数据,这些数据可用于测试聚类算法的效果。

例:

$X,y=make_blobs(n_samples=10,n_features=2,centers=[[-1,-1],[0,0]],cluster_std=[0.4,0.2]) $

输入:
n _ s a m p l e s n\_samples n_samples是待生成的样本的总数。
n _ f e a t u r e s n\_features n_features是每个样本的特征数。
c e n t e r s centers centers表示各类别中心。
c l u s t e r _ s t d cluster\_std cluster_std表示每个类别的方差。

输出:
X:样本特征,其中每行代表一个样本,每列代表一个特征。
y:样本聚类标签。

b.使用 m a t p l o t l i b . p y p l o t matplotlib.pyplot matplotlib.pyplot函数集中的 s c a t t e r scatter scatter与 s h o w show show函数画出并展示训练样本的散点图

例: p l t . s c a t t e r ( x , y ) plt.scatter(x,y) plt.scatter(x,y)

p l t . s h o w ( ) plt.show() plt.show()

scatter输入:
x:散点图的横坐标。
y:散点图的纵坐标。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris#使用make_blobs生成训练数据,生成100个样本,每个样本2个特征,共4个聚类,聚类中心分别为[-1,-1],[0,0],[1,1],[2,2],聚类方差分别为0.4,0.2,0.2,0.2
X,y = make_blobs(n_samples = 100, n_features = 2, centers = [[-1,-1],[0,0],[1,1],[2,2]], cluster_std = [0.4,0.2,0.2,0.2])
#画出训练样本的散点图,散点图的横坐标为样本的第一维特征,纵坐标为样本的第二维特征
plt.scatter(X[:,0], X[:,1])
plt.show()

2). k = 3 k=3 k=3进行聚类并画出聚类结果的散点图

提示:聚类可以通过 s k l e a r n . c l u s t e r sklearn.cluster sklearn.cluster的 K M e a n s KMeans KMeans类进行。

使用 K M e a n s KMeans KMeans的使用方法:

a.生成kmeans分类器:

k m e a n s = K M e a n s ( n _ c l u s t e r s = 4 ) kmeans=KMeans(n\_clusters=4) kmeans=KMeans(n_clusters=4)

其中:

n _ c l u s t e r s n\_clusters n_clusters: k值,聚类数量。

m a x _ i t e r max\_iter max_iter: 最大的迭代次数。

n _ i n i t n\_init n_init:用不同的初始化质心运行算法的次数,默认是10。
由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,一般取默认值。如果k值较大,则可以适当增大这个值。

i n i t init init: 即初始值选择的方式,可以为完全随机选择’random’,优化过的’k-means++‘或者指定初始化的k个质心。一般建议使用默认的’k-means++’。

b.使用 f i t _ p r e d i c t fit\_predict fit_predict方法计算聚类中心并且预测每个样本的聚类索引。

y _ p r e d = k m e a n s . f i t _ p r e d i c t ( X ) y\_pred=kmeans.fit\_predict(X) y_pred=kmeans.fit_predict(X)

c.可以通过以下方式将各聚类结果显示为不同的颜色

例: p l t . s c a t t e r ( x , y , c = l a b e l ) plt.scatter(x,y,c=label) plt.scatter(x,y,c=label)

p l t . s h o w ( ) plt.show() plt.show()

#生成kmeans分类器,聚类数量为3,其余参数使用默认值。
kmeans = KMeans(n_clusters = 3)
#使用fit_predict方法计算聚类中心并且预测每个样本的聚类索引。
y_pred = kmeans.fit_predict(X)
#画出训练样本的散点图,散点图的横坐标为样本的第一维特征,纵坐标为样本的第二维特征,将各聚类结果显示为不同的颜色
plt.scatter(X[:,0], X[:,1], c = y_pred)
plt.show()
#生成kmeans分类器,聚类数量为4,其余参数使用默认值。
kmeans = KMeans(n_clusters = 4)
#使用fit_predict方法计算聚类中心并且预测每个样本的聚类索引。
y_pred = kmeans.fit_predict(X)
#画出训练样本的散点图,散点图的横坐标为样本的第一维特征,纵坐标为样本的第二维特征,将各聚类结果显示为不同的颜色
plt.scatter(X[:,0], X[:,1], c = y_pred)
plt.show()

鸢尾花实战

iris = load_iris()     #导入iris数据集,iris数据集包含了150个样本,分别属于3类,每个样本包含4个特征
data_train=iris.data   #iris样本集的样本特征
label_train=iris.target #iris样本集的样本标签#生成kmeans分类器,聚类数量为3,其余参数使用默认值。
kmeans = KMeans(n_clusters = 3)
#使用fit_predict方法计算聚类中心并且预测每个样本的聚类索引。
y_pred = kmeans.fit_predict(data_train)
#画出训练样本的散点图,散点图的横坐标为样本的第一维特征,纵坐标为样本的第三维特征,将各聚类结果显示为不同的颜色
plt.scatter(data_train[:,0],data_train[:,2],c=y_pred)
plt.show()

k-menas底层源码

from numpy import *
import matplotlib.pyplot as plt
"""
函数说明:加载数据集
parameters:fileName -文件名
return:dataMat -数据列表
"""
def loadDataSet(fileName):      dataMat = []                fr = open(fileName)for line in fr.readlines():curLine = line.strip().split('\t')fltLine = list(map(float,curLine))  #将数据转换为float型数据dataMat.append(fltLine)return dataMat
"""
函数说明:计算向量欧氏距离
parameters:vecA -向量AvecB -向量B
return:欧氏距离
"""
def distEclud(vecA, vecB):### Start Code Here ####实现使用距离计算公式并返回distdist = sqrt(sum(power(vecA - vecB, 2))) ### End Code Here ###return dist"""
函数说明:为给定数据集构建一个包含k个随机质心的集合
parameters:dataSet -数据集k -质心个数
return:centroids -质心列表
"""
def randCent(dataSet, k):n = shape(dataSet)[1] centroids = mat(zeros((k,n)))                   #创建存储质心的矩阵,初始化为0for j in range(n):                              #随机质心必须再整个数据集的边界之内minJ = min(dataSet[:,j]) rangeJ = float(max(dataSet[:,j]) - minJ)    #通过找到数据集每一维的最小和最大值centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1)) #生成0到1之间的随机数,确保质心落在边界之内return centroids
"""
函数说明:K-均值算法
parameters:dataSet -数据集k -簇个数distMeas -距离计算函数createCent -创建初始质心函数
return:centroids -质心列表clusterAssment -簇分配结果矩阵
"""
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):### Start Code Here ####确定数据集中数据点的总数m = shape(dataSet)[0]  #创建矩阵来存储每个点的簇分配结果,第一列记录簇索引值,第二列存储误差clusterAssment = mat(zeros((m,2)))  #创建初始质心centroids = createCent(dataSet, k)#标志变量,若为True,则继续迭代clusterChanged = True while clusterChanged:clusterChanged = False for i in range(m):                               #遍历所有数据找到距离每个点最近的质心minDist = inf                                #使用minDist存储当前数据点的最小距离minIndex = -1                                #使用minIndex存储当前数据点的簇索引             for j in range(k):                          #遍历所有质心Dist = distEclud(centroids[j,:], dataSet[i,:]) #计算第i个数据点与第j个质心之间的距离,使用上面定义的distEclud函数if Dist < minDist:                                        #如果距离大于minDistminDist = Dist                                        #将minDist更新为最新距离minIndex = j                                    #将minIndex更新为当前的簇索引值if clusterAssment[i,0] != minIndex:        #如果clusterAssment中数据点i的簇索引值与当前找到的minIndex不同clusterChanged = True                  #说明需要进行更新,设置clusterChanged=TrueclusterAssment[i,:] = minIndex, minDist**2  #将数据点分配到距其最近的簇,并保存距离平方和print(centroids) for cent in range(k):                                                #对每一个簇ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#得到该簇中所有点的值centroids[cent,:] = mean(ptsInClust, axis = 0)                                            #计算所有点的均值并更新为质心### End Code Here ###return centroids, clusterAssment """
函数说明:绘图
parameters:centList -质心列表myNewAssments -簇列表dataMat -数据集k -簇个数
return:null
"""
def drawDataSet(dataMat,centList,myNewAssments,k):fig = plt.figure()      rect=[0.1,0.1,0.8,0.8]                                             #绘制矩形scatterMarkers=['s', 'o', '^', '8', 'p', 'd', 'v', 'h', '>', '<']  #构建标记形状的列表用于绘制散点图ax1=fig.add_axes(rect, label='ax1', frameon=False)for i in range(k):                                                 #遍历每个簇ptsInCurrCluster = dataMat[nonzero(myNewAssments[:,0].A==i)[0],:]markerStyle = scatterMarkers[i % len(scatterMarkers)]          #使用索引来选择标记形状ax1.scatter(ptsInCurrCluster[:,0].flatten().A[0], ptsInCurrCluster[:,1].flatten().A[0], marker=markerStyle, s=90)ax1.scatter(centList[:,0].flatten().A[0], centList[:,1].flatten().A[0], marker='+', s=300)    #使用"+"来标记质心plt.show()if __name__ =='__main__':dataMat = mat(loadDataSet('./testSet.txt'))centList,myNewAssments = kMeans(dataMat,4)print(centList)drawDataSet(dataMat,centList,myNewAssments,4)

k-means均值聚类相关推荐

  1. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  2. K-means均值聚类算法的原理与实现

    转自:http://blog.csdn.net/xiaolewennofollow/article/details/45541159 K-均值聚类算法的原理与实现 聚类是一种无监督的学习,它将相似的对 ...

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

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

  4. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法

    聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...

  5. k-means k均值聚类的弱点/缺点

    Similar to other algorithm, K-mean clustering has many weaknesses: 1 When the numbers of data are no ...

  6. K均值聚类关于初始聚类中心的探讨

    摘要:进入二十一世纪以来,科学技术的不断发展,使得数据挖掘技术得到了学者越来越多的关注.数据挖掘是指从数据库中发现隐含在大量数据中的新颖的.潜在的有用信息和规则的过程,是一种处理数据库数据的知识发现. ...

  7. python机器学习库sklearn——k均值聚类

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 k均值聚类的相关的知识内容可以参考 http://blog.csdn.net/luanpeng825485697/article/de ...

  8. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析

    目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...

  9. 讨论k值以及初始聚类中心对聚类结果的影响_K均值聚类需要标准化数据吗

    摘要:进入二十一世纪以来,科学技术的不断发展,使得数据挖掘技术得到了学者越来越多的关注.数据挖掘是指从数据库中发现隐含在大量数据中的新颖的.潜在的有用信息和规则的过程,是一种处理数据库数据的知识发现. ...

  10. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

最新文章

  1. 201109080909
  2. MongoDB实战(4)MapReduce
  3. ruby简单的基础 4
  4. js解析url query_js如何解析url
  5. 程序员面试题精选100题(06)-二元查找树的后序遍历结果[数据结构]
  6. BZOJ 1588: [HNOI2002]营业额统计
  7. python中的.idea文件夹是干嘛的
  8. python做神经网络有什么框架_神经网络与深度学习——基于TensorFlow框架和Python技术实现...
  9. win10下安装pytorch,torchvision遇到的bug
  10. LAPSUS$声称盗取源代码仓库,微软正在调查
  11. 在MySQL中,一条查询语句是如何执行的
  12. Linux -- 特殊权限 (转)
  13. Windows Server 2008 R2 小技巧
  14. 网上支付之易宝支付接入规范
  15. Win7平台上通过QQ查询对方IP地址
  16. cocos2dx之ipone5,iphone5s去黑边
  17. 创业公司股权架构搭建原则
  18. 内网穿透技术有哪些(经验分享)
  19. uc收藏导入html,win10系统下UC浏览器如何导入其他浏览器的收藏夹
  20. L1_SVD方法的稀疏矩阵的DOA估计

热门文章

  1. join left 大数据_left join 大数据
  2. Openssh7.4p1更换为8.2
  3. Android获取天气预报Demo
  4. git更换用户名和密码
  5. 简单了解消息中间件及ActiveMQ
  6. Kali与编程:Winserver2019上搭建wds网络部署服务器
  7. 获取tinyMCE编辑器中的内容
  8. C++PrimerPlus
  9. 重拾C语言——结构体和共用体
  10. SmartNIC — Overview