K-均值聚类算法和二分K-均值算法

环境:

jupyter

python3.6.5

数据集:

链接:kmeans_alod.tdz 
提取码:k3v2

准备工作

点击屏幕右上方的下载实验数据模块,选择下载kmeans_algo.tgz到指定目录下,然后再依次选择点击上方的File->Open->Upload,上传刚才下载的数据集压缩包,再使用如下命令解压:

!tar -zxvf kmeans_algo.tgz

结果如下:

kmeans_algo/
kmeans_algo/testSet.txt
kmeans_algo/testSet2.txt

【原理】无监督学习

从本节开始,我们进入了无监督学习的深深海洋。在监督学习中,即我们讲过的分类和回归,其目标变量的值是已知的。但在无监督学习中,目标变量事先并不存在。

与之前“对于输入数据X能预测变量Y”不同的是,这里要回答的问题是:“从数据X中能发现什么?”

【原理】聚类算法

我们先来介绍一下无监督学习中的聚类方法,聚类即将相似特征的数据聚集在一起,归到同一个簇中,它有点像全自动分类。聚类方法几乎可以应用于所有的数据对象,簇内的对象越相似,聚类效果越好。

用一个例子来帮助理解:

目前很常见的就是各个购物APP会为用户推荐商品,那么这个是怎么实现的呢?

APP会先收集用户的搜索记录,浏览记录等数据,因为这些数据都与用户的购物意向息息相关。然后,将这些信息输入到某个聚类算法中。接着,对聚类中的每一个簇,精心的选择,为其推荐相应的商品。最后,观察上述做法是否有效。

聚类和分类最大的不同在于,分类的目标事先已知,而聚类则不一样。聚类产生的结果与分类相同,而只是类别没有预先定义。也因此被称为无监督分类。

【原理】K-means聚类算法

在本节,我们主要介绍K-均值聚类算法,并用该算法对数据进行分组。

在介绍K-均值聚类算法前,我们先讨论一下簇识别(cluster identification)。簇识别给出聚类结果的含义,即告诉我们每堆相似的数据到底是什么。

我们已经知道聚类是将相似数归到一个簇中,那么如何度量相似呢?其取决于所选择的相似度计算方法。

接下来,开始我们对K-means聚类算法的学习!

【实验】K-均值聚类算法

K-均值是发现给定数据的k个簇的算法。而簇个数k是用户给定的,每个簇会通过其质心(centroid),即簇中所有点的中心来描述。

我们先来了解一下该算法的工作流程:

随机确定k个初始点作为质心
当任意一个点的簇分配结果发生改变时:
    为每个点寻找距其最近的质心
    将其分配给该质心所对应的簇
    将每个簇的质心更新为该簇所有点的平均值

在算法的工作流程中,我们提到了寻找距其最近的质心。那么如何计算“最近”的距离呢?我们可以使用任何可以度量距离的计算方法。但不同的计算方法会影响数据集上K-均值算法的性能。

本节我们使用的距离函数为欧氏距离。

 下面给出该算法的代码实现:

from numpy import *
import matplotlib.pyplot as plt
import numpy as np
"""
函数说明:加载数据集
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 -向量A
    vecB -向量B
return:
    欧氏距离
"""
def distEclud(vecA, vecB):
    return sqrt(sum(power(vecA - vecB, 2)))  #此处也可以使用其他距离计算公式
"""
函数说明:为给定数据集构建一个包含k个随机质心的集合
parameters:
    dataSet -数据集
    k -质心个数
return:
    centroids -质心列表
"""
def randCent(dataSet, k):
    n = shape(dataSet)[1]                           #返回数据点的维度
    centroids = mat(zeros((k,n)))                #创建存储质心的矩阵,初始化为0
    #补充下面代码,利用随机数生成函数rand()来生成随机初始centroids,注意随机质心必须在整个数据集的边界之内
    for j in range(n):
        minJ = min(dataSet[:,j])    # 求数据聚这一列的最小值
        rangeJ = float(max(dataSet[:,j]) - minJ)    # 求这一列的极差
        numpy.random.seed()
        centroids[:,j] = minJ + rangeJ * random.rand(k,1)    # 这样确保K个质心在数据集里面

    ####
    return centroids
"""
函数说明:K-均值算法
parameters:
    dataSet -数据集
    k -簇个数
    distMeas -距离计算函数
    createCent -创建初始质心函数
return:
    centroids -质心列表
    clusterAssment -簇分配结果矩阵
"""
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
    m= shape(dataSet)[0]                                #确定数据集中数据点的总数
    clusterAssmen
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值