本文转载自:http://www.javaxxz.com/thread-359535-1-1.html
Kmeans聚类算法的大概流程是:①从样本中随机找出K个样本作为中心点;
②求所有样本到这些样本的距离,按照最短的进行归类;
③求每个聚类中的样本的元素的平均值,作为新的中心点;
④继续②,③,知道所有样本再也无法找到新的聚类,就算完成。
### 一、接下来使用Numpy实现python代码,测试有效并且带注释:Kmeans.py:
```python
# encoding: utf-8
"""
Created on 2017年12月11日
"""
import time
from numpy import *
from scipy.cluster.hierarchy import centroid
import matplotlib.pyplot as plt
# 计算欧氏距离
def euclDistance(vector1,vector2):
return sqrt(sum(power(vector2-vector1,2)))
# 初始化K个中心点
def initCentroids(dataSet,k):
# 拿到数据集的格式 例如[[2,3,4][3,4,5]].shape = (2,3) [1,2,3] = (3,)
numSamples,dim = dataSet.shape
# 按照给定的shape,初始化一个数据类型和排列方式的填满0的数组
centroids = zeros((k,dim))
for i in range(k):
index = int(random.uniform(0,numSamples)) #样本集随机挑一个,作为初始质心
centroids[i,:] = dataSet[index,:]
return centroids
# k-means cluster
def kmeans(dataSet,k):
numSamples = dataSet.shape[0]
#mat 对数组转换用于线性操作,类型变为:numpy.matrixlib.defmatrix.matrix
# 初始化一个二维数据,第一列存储样本属于哪个聚类 第二列存储样本和中心的距离 [[0,0],[0,0]... ...]
clusterAssment = mat(zeros((numSamples,2)))
clusterChanged = True
## 步骤1:初始化中心点
centroids = initCentroids(dataSet, k)
while clusterChanged:
clusterChanged = False
# 遍历每个样本
for i in range(numSamples):
minDist = 1000000000.0 #与样本点最近族群距离
minIndex = 0 #所属族
#步骤2 找到一个最近的中心点
for j in range(k):
distance = euclDistance(centroids[j,:], dataSet[i,:]) #计算每个点到样本点的距离,找出最近的那一个样本
if distance len(mark):
print("Sorry! Your k is too large!please contact Zouxy")
return 1
for i in range(numSamples):
markIndex = int(clusterAssment[i,0]) #每个样本所属族群
plt.plot(dataSet[i,0],dataSet[i,1],mark[markIndex])
mark = ["Dr","Db","Dg","Dk","^b","+b","sb","db","<b","pb"]
for i in range(k):
plt.plot(centroids[i,0],centroids[i,1],mark,markersize = 6)
plt.show()
```
```python
# encoding: utf-8
"""
Created on 2017年12月11日
"""
from numpy import *
import time
import matplotlib.pyplot as plt
import kmeans.Kmeans as kean
#步骤1
print("step 1:load data...")
dataSet = []
fileIn = open("D:\Users\zhangjie116\Downloads\Wholesale customers data.csv")
i = 0;
for line in fileIn.readlines():
i = i + 1
lineArr = line.strip().split(",")
if i != 1 :
dataSet.append([float(lineArr[4]),float(lineArr[5])])
#步骤2
print("step 2:clustering")
dataSet = mat(dataSet)
k = 4
centroids,clusterAssment = kean.kmeans(dataSet, k)
#步骤3
print("step 3:show the result...")
kean.showCluster(dataSet, k, centroids, clusterAssment)
```
运行结果:
![](http://aodi.paic.com.cn/forum.php?mod=attachment&aid=NDc2M3xjZjAxMDdiMnwxNTEzMTU3NzEyfDEzMTF8NTA0MA%3D%3D&noupdate=yes)
### 二、使用scikit-learn库并且使用轮廓系数找出最佳K值计算
```python
# encoding: utf-8
"""
Created on 2017年12月13日
"""
import numpy as np
from sklearn import cluster
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn import metrics
#从数据集中加载数据
dataSet = []
fileIn = open("D:\Users\zhangjie116\Downloads\Wholesale customers data.csv")
i = 0;
for line in fileIn.readlines():
i = i + 1
lineArr = line.strip().split(",")
if i != 1 :
dataSet.append([float(lineArr[4]),float(lineArr[5])])
#代码生成数据集
cluster1=np.random.uniform(0.5,1.5,(2,10))
cluster2=np.random.uniform(3.5,4.5,(2,10))
cluster3=np.random.uniform(7.5,8.5,(2,10))
dataSet=np.hstack((cluster1,cluster2,cluster3)).T
max_silhouette_coefficient = 0
max_k = 0
max_centroids = []
max_labels_ = []
numSamples = 0
for k in range(2,10):
#设定K
clf = KMeans(n_clusters=k)
#加载数据集合
s = clf.fit(dataSet)
#样本数量
numSamples = len(dataSet)
#中心点
centroids = clf.cluster_centers_
labels_ = clf.labels_
#获取轮廓系数
silhouette_coefficient = metrics.silhouette_score(dataSet, clf.labels_,metric="euclidean",sample_size=numSamples)
print "k:%d ==== silhouette_coefficient:%f"%(k,silhouette_coefficient)
#找到轮廓系数最大的K值,为效果最好的
if max_silhouette_coefficient < silhouette_coefficient :
max_silhouette_coefficient = silhouette_coefficient
max_k = k
max_centroids = centroids
max_labels_ = labels_
#获取聚类效果值
print "k:%d ==== inertia_:%f"%(k,clf.inertia_)
print "max_k:%d ==== max_silhouette_coefficient:%f"%(max_k,max_silhouette_coefficient)
#画出所有样例点 属于同一分类的绘制同样的颜色
mark1 = ["or", "ob", "og", "ok", "^r", "+r", "sr", "dr", "<r", "pr"]
for i in xrange(numSamples):
plt.plot(dataSet[0], dataSet[1], mark1[max_labels_]) #mark[markIndex])
mark2 = ["Dr", "Db", "Dg", "Dk", "^b", "+b", "sb", "db", "<b", "pb"]
# 画出质点,用特殊图型
for i in range(max_k):
plt.plot(max_centroids[i,0], max_centroids[i,1], mark2,markersize = 12)
plt.show()
```
运行结果:
```
k:2 ==== silhouette_coefficient:0.749433
k:2 ==== inertia_:93.451706
k:3 ==== silhouette_coefficient:0.887454
k:3 ==== inertia_:4.294235
k:4 ==== silhouette_coefficient:0.746558
k:4 ==== inertia_:3.366372
k:5 ==== silhouette_coefficient:0.579589
k:5 ==== inertia_:2.555257
k:6 ==== silhouette_coefficient:0.622791
k:6 ==== inertia_:2.088957
k:7 ==== silhouette_coefficient:0.452267
k:7 ==== inertia_:1.602857
k:8 ==== silhouette_coefficient:0.447269
k:8 ==== inertia_:1.265230
k:9 ==== silhouette_coefficient:0.454158
k:9 ==== inertia_:0.976325
max_k:3 ==== max_silhouette_coefficient:0.887454
```
![](http://aodi.paic.com.cn/forum.php?mod=attachment&aid=NDgwMnw0YWRjNjY0ZHwxNTEzMTU3NzEyfDEzMTF8NTA0MA%3D%3D&noupdate=yes)
相关推荐
机器学习领域涉及多种算法,其中聚类算法是一个重要分支,常见的聚类算法有kmeans,虽然原理简单,简单易用,但通常需要事先确定K值,k值选取与具体数据和业务场景紧密相关,一旦k值选取不合理会导致模型效果出现...
文本聚类是机器学习领域的一种无监督学习方法,主要用于对大量文本数据进行分类,而无需预先知道具体的类别信息。在本案例中,我们将探讨如何使用Python实现K-Means算法来对文本数据进行聚类。K-Means是一种广泛应用...
这些指标可以帮助我们判断聚类的紧密度和分离度,从而选择最佳的K值。 总结来说,K-Means和K-中心点聚类算法是数据挖掘中的基础工具,它们在Python中可以通过简单的代码实现。通过`实验四数据.csv`的数据,我们可以...
总之,"KMeans聚类算法-手肘法"的主题涵盖了数据预处理、模型训练、K值选择、结果评估和可视化等多个方面,是机器学习初学者和从业者学习聚类算法的重要实践案例。通过分析和运行`kmeans_210730`文件,可以深入理解...
本文将深入探讨两种广泛使用的聚类算法——KMeans和DBSCAN,并通过Python语言来阐述其实现。 首先,KMeans算法是基于原型的聚类方法,它的核心思想是将数据分为K个不同的簇,每个簇由一个中心点或原型表示。以下为...
KMeans聚类算法是机器学习领域中广泛应用的一种无监督学习方法,主要用于数据的分组或分类。它通过迭代过程将数据点分配到最近的聚类中心,从而形成不同的簇。KMeans算法简单、易于理解且在大数据集上也能高效运行,...
K-Means算法是其中最常用且理解简单的聚类算法之一。本篇将深入探讨K-Means算法及其代码实现,并对相关的Meanshift算法进行简单介绍。 ### K-Means算法原理 K-Means算法的目标是将数据集划分为K个不同的簇,使得每...
接着,实例化`KMeans`对象,指定k值,训练模型,并将预测结果分配回原始数据。最后,可以可视化结果,如绘制散点图,以展示不同类别的分布。 ```python from sklearn.cluster import KMeans from sklearn.datasets ...
在机器学习领域,KMeans算法是一种广泛应用的无监督学习方法,用于数据聚类。它通过迭代寻找数据点的最优分组,使得同一组内的数据点彼此间的距离最小,而不同组之间的距离最大。本教程将深入探讨如何使用Python语言...
在实验中,我们使用手肘法和轮廓系数法来确定 K 值的最佳聚类数目,并采用 K-means 聚类算法对实验数据进行聚类。实验结果表明,K-means 方法是一种简单高效的聚类方法,但其结果受 K 值的影响很大,同时该方法也...
本资源包含了一个关于Python实现聚类算法KMeans的完整实例,特别适合初学者了解和实践。 KMeans算法是聚类中最常用的一种方法,它的核心思想是迭代优化,通过不断调整数据点的类别归属,以最小化各簇内数据点的平方...
在这个"Python——机器学习实战——K均值聚类算法分组"的教程中,我们将深入探讨如何使用Python来实现这个算法。 首先,K均值算法的核心思想是通过迭代找到最佳的K个聚类中心,使得每个数据点到其所属类别中心的...
《KMeans聚类算法在高校宿舍分配中的应用与Python实现》 KMeans聚类算法,作为数据挖掘领域中的一种常用无监督学习方法,被广泛应用于各类数据分类与聚类问题。在高校宿舍分配中,利用KMeans算法可以有效优化学生的...
在本项目中,我们将深入探讨基于Python的机器学习技术,特别是K-means聚类算法,通过分析NBA球员的数据来划分球员群体。K-means是一种无监督学习方法,用于将数据集分成不同的组或“簇”,其中每个簇内的数据点彼此...
KMeans聚类是一种广泛应用的无监督机器学习算法,主要用于数据的分组或分类。它将数据集中的样本点分配到K个预定义的类别中,每个类别由一个聚类中心来代表。KMeans的主要目标是通过最小化样本点与所属类别中心的...
Python的科学计算库Scikit-learn提供了丰富的机器学习算法,包括`KMeans`和`DBSCAN`。`sklearn.cluster.KMeans`是KMeans的实现,而`sklearn.cluster.DBSCAN`则是DBSCAN的实现。使用这些类,用户可以方便地进行聚类...
在这个“Python数据分析与机器学习-聚类实践”主题中,我们将深入探讨聚类算法在Python中的应用。 聚类分析的目标是将相似的数据分组到不同的簇(clusters)中,每个簇内的数据点相互之间具有较高的相似度,而不同...
K-Means是最常用的聚类算法之一,它通过迭代寻找最佳的K个聚类中心,将数据分配到最近的聚类中心所属的类别。算法的关键在于选择初始中心和距离度量方式(如欧几里得距离)。Python中可以使用`scikit-learn`库的`...
**KMeans与Kmeans++算法Python代码实现** KMeans算法是一种经典的无监督学习方法,用于数据聚类。它通过迭代优化来寻找最佳的聚类中心,使得每个样本点到其所属簇中心的距离平方和最小。KMeans++是KMeans的一个改进...