`
Ilovejava1
  • 浏览: 17654 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

机器学习算法之聚类算法Kmeans并找出最佳K值的Python实践

阅读更多

本文转载自: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自动计算gap,自动确定k值

    机器学习领域涉及多种算法,其中聚类算法是一个重要分支,常见的聚类算法有kmeans,虽然原理简单,简单易用,但通常需要事先确定K值,k值选取与具体数据和业务场景紧密相关,一旦k值选取不合理会导致模型效果出现...

    K-Means文本聚类python实现

    文本聚类是机器学习领域的一种无监督学习方法,主要用于对大量文本数据进行分类,而无需预先知道具体的类别信息。在本案例中,我们将探讨如何使用Python实现K-Means算法来对文本数据进行聚类。K-Means是一种广泛应用...

    Python从零实现 K-mean 和K-中心点聚类算法的样本数据

    这些指标可以帮助我们判断聚类的紧密度和分离度,从而选择最佳的K值。 总结来说,K-Means和K-中心点聚类算法是数据挖掘中的基础工具,它们在Python中可以通过简单的代码实现。通过`实验四数据.csv`的数据,我们可以...

    Kmeans聚类算法-手肘法

    总之,"KMeans聚类算法-手肘法"的主题涵盖了数据预处理、模型训练、K值选择、结果评估和可视化等多个方面,是机器学习初学者和从业者学习聚类算法的重要实践案例。通过分析和运行`kmeans_210730`文件,可以深入理解...

    聚类算法Python实现(KMeans、DBSCAN)

    本文将深入探讨两种广泛使用的聚类算法——KMeans和DBSCAN,并通过Python语言来阐述其实现。 首先,KMeans算法是基于原型的聚类方法,它的核心思想是将数据分为K个不同的簇,每个簇由一个中心点或原型表示。以下为...

    机器学习算法之KMeans聚类算法实现.zip

    KMeans聚类算法是机器学习领域中广泛应用的一种无监督学习方法,主要用于数据的分组或分类。它通过迭代过程将数据点分配到最近的聚类中心,从而形成不同的簇。KMeans算法简单、易于理解且在大数据集上也能高效运行,...

    聚类算法与Kmeans代码_K-Means聚类_

    K-Means算法是其中最常用且理解简单的聚类算法之一。本篇将深入探讨K-Means算法及其代码实现,并对相关的Meanshift算法进行简单介绍。 ### K-Means算法原理 K-Means算法的目标是将数据集划分为K个不同的簇,使得每...

    k - means聚类分析算法

    接着,实例化`KMeans`对象,指定k值,训练模型,并将预测结果分配回原始数据。最后,可以可视化结果,如绘制散点图,以展示不同类别的分布。 ```python from sklearn.cluster import KMeans from sklearn.datasets ...

    机器学习算法之使用Python实现KMeans算法.zip

    在机器学习领域,KMeans算法是一种广泛应用的无监督学习方法,用于数据聚类。它通过迭代寻找数据点的最优分组,使得同一组内的数据点彼此间的距离最小,而不同组之间的距离最大。本教程将深入探讨如何使用Python语言...

    实验报告——Kmeans聚类方法.docx

    在实验中,我们使用手肘法和轮廓系数法来确定 K 值的最佳聚类数目,并采用 K-means 聚类算法对实验数据进行聚类。实验结果表明,K-means 方法是一种简单高效的聚类方法,但其结果受 K 值的影响很大,同时该方法也...

    python机器学习 聚类算法Kmeans代码实现 包含所用数据集和代码

    本资源包含了一个关于Python实现聚类算法KMeans的完整实例,特别适合初学者了解和实践。 KMeans算法是聚类中最常用的一种方法,它的核心思想是迭代优化,通过不断调整数据点的类别归属,以最小化各簇内数据点的平方...

    Python——机器学习实战——K均值聚类算法分组

    在这个"Python——机器学习实战——K均值聚类算法分组"的教程中,我们将深入探讨如何使用Python来实现这个算法。 首先,K均值算法的核心思想是通过迭代找到最佳的K个聚类中心,使得每个数据点到其所属类别中心的...

    基于KMeans聚类算法在高校宿舍分配中的应用python源码设计带演示视频.7z

    《KMeans聚类算法在高校宿舍分配中的应用与Python实现》 KMeans聚类算法,作为数据挖掘领域中的一种常用无监督学习方法,被广泛应用于各类数据分类与聚类问题。在高校宿舍分配中,利用KMeans算法可以有效优化学生的...

    基于Python的机器学习K-means聚类分析NBA球员案例

    在本项目中,我们将深入探讨基于Python的机器学习技术,特别是K-means聚类算法,通过分析NBA球员的数据来划分球员群体。K-means是一种无监督学习方法,用于将数据集分成不同的组或“簇”,其中每个簇内的数据点彼此...

    Kmeans聚类

    KMeans聚类是一种广泛应用的无监督机器学习算法,主要用于数据的分组或分类。它将数据集中的样本点分配到K个预定义的类别中,每个类别由一个聚类中心来代表。KMeans的主要目标是通过最小化样本点与所属类别中心的...

    Matlab和Python聚类算法代码包含dbscan和kmeans算法

    Python的科学计算库Scikit-learn提供了丰富的机器学习算法,包括`KMeans`和`DBSCAN`。`sklearn.cluster.KMeans`是KMeans的实现,而`sklearn.cluster.DBSCAN`则是DBSCAN的实现。使用这些类,用户可以方便地进行聚类...

    Python数据分析与机器学习-聚类实践

    在这个“Python数据分析与机器学习-聚类实践”主题中,我们将深入探讨聚类算法在Python中的应用。 聚类分析的目标是将相似的数据分组到不同的簇(clusters)中,每个簇内的数据点相互之间具有较高的相似度,而不同...

    经典聚类算法python实现

    K-Means是最常用的聚类算法之一,它通过迭代寻找最佳的K个聚类中心,将数据分配到最近的聚类中心所属的类别。算法的关键在于选择初始中心和距离度量方式(如欧几里得距离)。Python中可以使用`scikit-learn`库的`...

    Kmeans与Kmeans++算法Python代码实现

    **KMeans与Kmeans++算法Python代码实现** KMeans算法是一种经典的无监督学习方法,用于数据聚类。它通过迭代优化来寻找最佳的聚类中心,使得每个样本点到其所属簇中心的距离平方和最小。KMeans++是KMeans的一个改进...

Global site tag (gtag.js) - Google Analytics