【机器学习理论】第3部分 聚类分析

来源:互联网 发布:ppt软件下载官方 编辑:程序博客网 时间:2024/06/14 02:21

1、概述

聚类分析可以应用到多个领域中,在生物学中,聚类可以辅助动植物分类的研究,可以通过对基因数据的聚类,找出功能相似的基因;在地理信息系统中,聚类可以找出具有相抵用途的区域,辅助石油开采;在商业上,聚类可以帮助市场分析人员对消费者的消费记录进行分析,从而得出消费者的消费模式,实现消费群体的区分。

聚类就是将数据对象分组成多个类簇,划分的原则就是使得同一个簇内的对象之间具有较高的相似度,而不同簇之间对象之间的差异最大,一个类簇内的任意两点之间的距离小于不同类簇的任意两个点之间的距离。

聚类与分类之间的区别:聚类是无监督学习,涉及到的数据集合的特征是未知的,并且在开始聚类之前,用户并不知道要把数据划分成几类,并没有一个分类的标准;分类是典型的有监督学习,分类的实例或数据对象有类型标记,也就是说,用户在分类之前是知道需要分成几类的,并且各个类别也已经确定了,主要就是利用分类器将处理的数据分到不同的类别中。

2、聚类的过程

(1)数据准备:包括特征标准化和降维

(2)特征选择和提出:从最初的特征中,选择最有效的特征,并将其存储在向量中

(3)特征提取:对所选择的特征进行转换,形成新的突出特征

(4)聚类:选择合适特征类型的某种距离函数进行接近程度的度量,执行聚类

(5)聚类结果评估:外部有效性评估、内部有效性评估和相关性测试评估

3、数据结构

(1)数据矩阵(Data Matrix)

这种数据结构被称为“对象-属性”结构,类似于关系表的形式表示n个具有p个属性的对象,可以直接使用n×p维的矩阵来表示:
这里写图片描述

(2)差异性矩阵(Dissimilarity Matrix)

这种数据结构存储n个对象两两之间的近似性,表现形式为一个n×n维的矩阵:
这里写图片描述

d(i,j)是对象i和对象j之间相异性的量化表示,通常是一个非负的数值,d(i,j)=d(j,i),当对象i和对象j越相似,其值越接近0,两个对象差别越大,其值就越大。

数据矩阵也被称为二模矩阵,而相异性矩阵则称为单模矩阵。

4、数据类型

聚类分析起源于统计学,传统的分析方法大多是在数值类型的数据上进行研究,但是数据挖掘的对象是多样的,对于聚类分析方法的运用,也不仅仅只从数值类型进行数据的分析。

数据挖掘中,经常出现的类型包括:区间标度变量、二元变量、标称型、序数型、比例标度型变量以及混合类型的变量。

(1)区间标度变量

(2)二元变量

二元变量只有两个状态:0和1,其中1代表相应的状态存在,0代表相应的状态不存在。

二元变量又分为对称二元变量和非对象二元变量:

      对称二元变量:指变量的两个状态不具有优先权,两个状态具有相等的重要性,而在度量两个变量的差异度由简单匹配系数决定

      非对称二元变量:不同的状态其重要性是不同的,度量两个变量的差异度使用杰卡德系数表示

设两个对象:

q:两个对象中都为1的属性数目;

s:两个对象中,一个为0,一个为1的属性数目;

t:两个对象中都为0的属性数目;

p:所有属性的数目,p=q+s+t

如果对象的属性是对称二值属性,则对象的差异度计算采用简单匹配系数法:
这里写图片描述

如果对象的属性是非对称二值属性,若认为取值为1的状态比取值为0的状态重要,则对象的差异度计算采用杰卡德系数法:
这里写图片描述

5、相似性度量

(1)闵可夫斯基距离

(2)曼哈顿距离

(3)欧氏距离

  参见:http://blog.csdn.net/kevinelstri/article/details/53670172

6、聚类准则函数

聚类准则函数用于评价聚类结果的质量,如果聚类质量不能满足,就要重复执行聚类过程,以便于优化聚类结果

(1)误差平方和准则函数

(2)加权平均平方距离和准则

(3)类间距离和准则

7、主要聚类算法

(1)基于划分的方法
      划分聚类就是对一个数据集合进行划分,对具有n个对象的集合进行k组划分,k≤n。在这个划分过程中,也需要满足一定的条件:首先每个组至少包含一个对象,其次每个对象必须属于且仅属于一个组。在数据划分聚类的过程中,首选要选定一个划分分组数目k,也就是类簇个数,然后通过相似度的计算来对数据进行比较,采用迭代的方式把一个个对象放到不同的分组中,尽可能使得属于同一个类簇的对象之间的相似度较大,属于不同类簇的对象之间的相似度较小。
      基于划分的聚类分析方法主要包括:k-means聚类算法、k-medoid算法等。

(2)基于层次的方法
      层次聚类是对给定的数据对象集合进行层次的分解,按照数据分层来建立数据分组,形成一个以组为节点的树。层次聚类方法按照对数据分解的方向可以分为自底向上的分解和自顶向下的分解。
      自底向上的分解称为凝聚层次聚类,就是在数据集合中,将每个数据对象作为一个簇,然后通过相似度的判断,将相似度较大的两个簇进行合并,不断迭代,实现聚类的目的。当然在聚类的过程中,要首先有一个聚类的标准或是终止条件,在迭代的过程中,当达到终止条件才进行终止聚类的过程,同时也满足每个簇中至少有一个对象,每个对象都必须且属于同一个簇。
      自顶向下的分解称为分裂层次聚类,在数据集合中,首先将整个数据集合构成一个簇,将其看成树的根,然后通过对这个簇进行不断的划分,划分成更小的簇,最终保证每个对象都处于一个单独的簇中。
      基于层次的聚类分析方法主要包括:Birch算法、Cure算法等

(3)基于密度的方法
      基于划分的方法和基于层次的方法都是使用对象之间的距离来描述对象之间的相似度,那么对于不规则的数据集合,又该如何处理呢?基于密度的方法就是为了处理具有不规则形状的聚类集合,其可以发现任意形状的簇,将簇的划分按照稠密程度进行划分,只要邻近区域的密度超过某一个阈值,就把它加到与之相近的聚类中,通过这种阈值的判断进行聚类的划分。
      基于密度的聚类分析方法主要包括:DBSCAN算法、optics算法等。

(4)基于网络的方法

(5)基于模型的方法

8、K-means聚类算法

随机选取k个点作为初始聚类中心,然后计算各个样本到聚类中心的距离,把样本归到离它最近的那个聚类中心所在的类簇;对调整后的新簇计算新的聚类中心,如果相邻两次的聚类中心没有任何变化,说明样本调整结束,这时某个误差平方和函数已经达到最小,聚类准则函数已经收敛。

9、K-means聚类算法案例分析

(1)sklearn

(2)直接写算法

# encoding:utf-8from numpy import *from math import *# 加载数据集def loadDataSet(fileName):  # 将一个文本文件导入到列表中    dataMat = []  # 创建一个dataMat空列表    fr = open(fileName)    for line in fr.readlines():  # 一行一行的读取文本文件        curLine = line.strip().split('\t')        fltLine = map(float, curLine)        dataMat.append(fltLine)    return dataMat# 计算两个向量的欧式距离def distEclud(vecA, vecB):    return sqrt(sum(power(vecA - vecB, 2)))# 随机构建初始质心def randCent(dataSet, k):  # 构建一个包含k个随机质心的集合    # 数据列数    n = shape(dataSet)[1]    # 初始化质心    centroids = mat(zeros((k, n)))    for j in range(n):        # 数据集中每一维的最小和最大值,保证随机选取的质心在边界之内        minJ = min(dataSet[:, j])        rangeJ = float(max(dataSet[:, j]) - minJ)        centroids[:, j] = mat(minJ + rangeJ * random.rand(k, 1))    return centroids    # k-均值算法:四个参数(数据集、簇的数目、距离、创建初始质心)def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):    # 数据点的行数    m = shape(dataSet)[0]    # 用于记录数据点到质心的距离平方    clusterAssment = mat(zeros((m, 2)))    # 中心点    centroids = createCent(dataSet, k)    # 聚类结束标志    clusterChanged = True    while clusterChanged:        clusterChanged = False        # 遍历每条数据        for i in range(m):            # 设置两个变量,分别存放数据点到质心的距离,及数据点属于哪个质心            minDist = inf;            minIndex = -1            # 遍历每个质心            for j in range(k):                distJI = distMeas(centroids[j, :], dataSet[i, :])                if distJI < minDist:                    # 将数据归为最近的质心                    minDist = distJI;                    minIndex = j                    # 簇分配结果发生改变,更新标志            if clusterAssment[i, 0] != minIndex: clusterChanged = True            clusterAssment[i, :] = minIndex, minDist ** 2        print centroids        # 更新质心        for cent in range(k):  # recalculate centroids            ptsInClust = dataSet[nonzero(clusterAssment[:, 0].A == cent)[0]]  # get all the point in this cluster            centroids[cent, :] = mean(ptsInClust, axis=0)  # assign centroid to mean    return centroids, clusterAssment# 数据导入data = loadDataSet('testSet.txt')print "data:"print dataprint "\n"# 将数据按照矩阵方式输出dataMat = mat(data)# print "dataMat:"# print dataMat# print "\n"centroids, clusterAssment = kMeans(dataMat, 4)print centroids, clusterAssment

简单总结先简单记录一下,之后还要不断的深入学习….

0 0
原创粉丝点击