k-means均值聚类
k-means均值聚类
- 随机生成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均值聚类相关推荐
- K-Means(K均值聚类算法)
K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...
- K-means均值聚类算法的原理与实现
转自:http://blog.csdn.net/xiaolewennofollow/article/details/45541159 K-均值聚类算法的原理与实现 聚类是一种无监督的学习,它将相似的对 ...
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法
聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...
- k-means k均值聚类的弱点/缺点
Similar to other algorithm, K-mean clustering has many weaknesses: 1 When the numbers of data are no ...
- K均值聚类关于初始聚类中心的探讨
摘要:进入二十一世纪以来,科学技术的不断发展,使得数据挖掘技术得到了学者越来越多的关注.数据挖掘是指从数据库中发现隐含在大量数据中的新颖的.潜在的有用信息和规则的过程,是一种处理数据库数据的知识发现. ...
- python机器学习库sklearn——k均值聚类
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 k均值聚类的相关的知识内容可以参考 http://blog.csdn.net/luanpeng825485697/article/de ...
- 聚类分析 | MATLAB实现k-Means(k均值聚类)分析
目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...
- 讨论k值以及初始聚类中心对聚类结果的影响_K均值聚类需要标准化数据吗
摘要:进入二十一世纪以来,科学技术的不断发展,使得数据挖掘技术得到了学者越来越多的关注.数据挖掘是指从数据库中发现隐含在大量数据中的新颖的.潜在的有用信息和规则的过程,是一种处理数据库数据的知识发现. ...
- k均值聚类算法python_K均值和其他聚类算法:Python快速入门
k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...
最新文章
- 201109080909
- MongoDB实战(4)MapReduce
- ruby简单的基础 4
- js解析url query_js如何解析url
- 程序员面试题精选100题(06)-二元查找树的后序遍历结果[数据结构]
- BZOJ 1588: [HNOI2002]营业额统计
- python中的.idea文件夹是干嘛的
- python做神经网络有什么框架_神经网络与深度学习——基于TensorFlow框架和Python技术实现...
- win10下安装pytorch,torchvision遇到的bug
- LAPSUS$声称盗取源代码仓库,微软正在调查
- 在MySQL中,一条查询语句是如何执行的
- Linux -- 特殊权限 (转)
- Windows Server 2008 R2 小技巧
- 网上支付之易宝支付接入规范
- Win7平台上通过QQ查询对方IP地址
- cocos2dx之ipone5,iphone5s去黑边
- 创业公司股权架构搭建原则
- 内网穿透技术有哪些(经验分享)
- uc收藏导入html,win10系统下UC浏览器如何导入其他浏览器的收藏夹
- L1_SVD方法的稀疏矩阵的DOA估计