机器学习之K均值聚类

K均值聚类思想  聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离、马氏距离、相关系数、余弦定理、层次聚类和K均值聚类等  K均值聚类的

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

K均值聚类思想

  聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离、马氏距离、相关系数、余弦定理、层次聚类和K均值聚类等

  K均值聚类的基本思想是,通过迭代的方法寻找K个簇的一种划分方案,使得聚类结果对应的代价函数最小,特别地,代价函数可以定义为各个样本距离所属簇中心点的误差平方和$$J(c,\sigma) = \sum_{i=1}^M{||x_i – \sigma_{c_i}||}^2$$

其中\(x_i\)代表第i个样本点,\(c_i\)\(x_i\)所属于的簇,\(\sigma_{c_i}\)代表簇对应的中心点,M是样本总数

K-Mean_Cluster算法实现

使用’/datasets/kmeansTestSet.txt’数据集测试K均值聚类算法

def loadDataset(file):
    dataset = []
    with open(file,'r') as pf:
        for line in pf:
            dataset.append([float(x) for x in line.strip().split('\t')])
    return dataset
#加载数据
dataset = loadDataset('./datasets/kmeansTestSet.txt')
print(len(dataset))
print(dataset[:5])
80
[[1.658985, 4.285136], [-3.453687, 3.424321], [4.838138, -1.151539], [-5.379713, -3.362104], [0.972564, 2.924086]]
import numpy as np
#对数据进行归一化处理
def normalize(dataset):
    dataMat = np.mat(dataset)
    mean = np.mean(dataMat)
    var = np.var(dataMat)
    meanDataMat = (dataMat - mean) / var #将数据进行归一化处理
    return meanDataMat
import matplotlib.pyplot as plt
import pandas as pd

#以图形方式展现数据
def plotDataset(meanDataMat,pointCenter = False,centerPointerMat=None):
    dataFrame = pd.DataFrame(meanDataMat) #转换为DataFrame,方便查看数据属性
    print(dataFrame.describe())
    #plt.axis([0,1,0,1])
    plt.plot(meanDataMat[:,0],meanDataMat[:,1],'r*')
    if pointCenter:
        plt.plot(centerPointerMat[:,0],centerPointerMat[:,1],'b*')
    plt.show()
meanDataMat = normalize(dataset)
plotDataset(meanDataMat)
               0          1
count  80.000000  80.000000
mean   -0.008614   0.008614
std     0.331392   0.333145
min    -0.584224  -0.459075
25%    -0.306803  -0.325977
50%     0.005867   0.019362
75%     0.290189   0.323504
max     0.530519   0.568950

机器学习之K均值聚类

def distance(vectA,vectB):
    Power = np.power((vectA - vectB),2)
    Sum = np.sum(Power,axis = 1)
    return float(np.sqrt(Sum)) 
import random
def kcluster(meanDataMat,k=4):
    row,col = meanDataMat.shape
    print(row,col)
    featureRange = []
    for i in range(col):
        Min = np.min(meanDataMat[:,i])
        Max = np.max(meanDataMat[:,i])
        featureRange.append((Min,Max))
    centerPoints = []  #中心点
    classPoints = []   #聚类数据点
    classLabels = np.mat(np.zeros((row,2)))
    for i in range(k):
        centerPoints.append([random.uniform(r[0],r[1]) for r in featureRange])
        classPoints.append([])
    centerPointsMat = np.mat(centerPoints)
    clusterChanged = True
    while(clusterChanged):
        clusterChanged = False
        for i in range(row):
            minDis = np.inf
            bestK = -1
            for j in range(k):
                dis = distance(meanDataMat[i,:],centerPointsMat[j,:])
                if dis < minDis:
                    minDis = dis
                    bestK = j
            if classLabels[i,0] != bestK:
                clusterChanged = True
            classLabels[i,:] = bestK,minDis
        for center in range(k):
            ptsInClust = meanDataMat[np.nonzero(classLabels[:,0] == center)[0]]  #该步骤需要特别注意,精妙
            centerPointsMat[center,:] = np.mean(ptsInClust,axis=0)
    print('已完成聚类')
    return centerPointsMat,classLabels
centerPointsMat,classLabels = kcluster(meanDataMat)
80 2
已完成聚类
plotDataset(meanDataMat,pointCenter=True,centerPointerMat = centerPointsMat)
               0          1
count  80.000000  80.000000
mean   -0.008614   0.008614
std     0.331392   0.333145
min    -0.584224  -0.459075
25%    -0.306803  -0.325977
50%     0.005867   0.019362
75%     0.290189   0.323504
max     0.530519   0.568950

机器学习之K均值聚类

K均值算法的缺点

(1)需要人工预先确定初始值K值,且该值和真实的数据分布未必吻合

(2)K均值只能收敛到局部最优,效果受到初始值的影响

(3)易受噪点和离群点的影响

(4)样本点只能被划分到单一的类中

K均值聚类算法改进模型

K-means++算法

K均值的改进算法种,对初始值选择的改进种是很重要的一部分,而这类算法中,最具影响力的当属K-means++算法,原始K均值算法最开始随机的选取K个中心点,而K-means++按照如下的思想选取K个聚类中心:

假设已经选取了n个初始聚类中心(0<n<k),则在选取第n+1个聚类中心时,距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心点。聚类中心点当然是相互离的越远越好。当选择完初始点后K-means++后续的执行和经典K均值算法相同

ISODATA算法

在K均值算法种,聚类个数K的值需要预先认为确定,并且在整个算法过程种无法改变,而当遇到高维度、海量的数据集时,人们往往很难准确地估计出K的大小,ISODATA的全称为迭代自组织数据分析法,就是针对这个问题进行了改进,它的思想很直观,主要通过迭代的方法对分类进行拆分和合并,这需要制定3个阈值:

(1)每个类所要求的最少样本数目\(N_min\),如果分裂后会导致某个子类别所包含样本数目小于该阈值,就不会对该类别进行分裂操作

(2)最大方差Sigma,用于控制某个类别中样本的分散程度,当样本的分散程度超过某个阈值时,进行分裂操作

(3)两个聚类中心之间所允许的最小距离\(D_min\),如果两个类考的非常近(即这两个类别对应聚类中心之间距离非常小),小于该阈值时,则对这两个类进行合并操作

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120027.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux top cpu核数查看,Linux怎么查看CPU核数?

    linux top cpu核数查看,Linux怎么查看CPU核数?在Linux中,可以使用“cat/proc/cpuinfo|grep”cpucores”|uniq”来查看CPU核数,即每个物理CPU中core的个数。课程推荐:《linux课程》一、知识点介绍1、cpu信息记录在/proc/cpuinfo中。2、Linux中的Top相当于win系统下的任务管理器,也可以用来查询3、CPU总核数=物理CPU个数*每颗物理CPU的核数4、总逻辑CP…

    2022年10月30日
    0
  • iframe的高度自适应_div自适应高度

    iframe的高度自适应_div自适应高度Demo页面:主页面iframe_a.html,被包含页面iframe_b.htm和iframe_c.html下面开始讲:通过Google搜索iframe自适应高度,结果5W多条,搜索iframe高度自适应,结果2W多条。我翻了前面的几十条,刨去大量的转载,有那么三五篇是原创的。而这几篇原创里面,基本上只谈到如何自适应静的东西,就是没有考虑到JS操作DOM之后,如

    2022年10月12日
    0
  • php拼接循环拼接字符串数组,PHP数组拼接

    php拼接循环拼接字符串数组,PHP数组拼接最近的工作中老是要遇到将两个数组进行拼接的操作。下面总结一下数组拼接的几个函数及它们的不同点。PHP中两个数组合并可以使用+或者array_merge,但之间还是有区别的,而且这些区别如果了解不清楚项目中会要命的!主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意。1)键名为数字时,array_merge()后面的值将不会覆盖原来的值,而是附加到后面,但+合并数组则会把…

    2022年5月30日
    42
  • Mysql学习——MySQL导入导出.sql文件及常用命令

    Mysql学习——MySQL导入导出.sql文件及常用命令在日常学习和工作,难免不了使用Mysql数据库,有时候需要导入导出数据库,或者其中的数据表。下面是我自己整理的一些东西!

    2022年2月24日
    29
  • python 文件路径名,文件名,后缀名的操作

    python 文件路径名,文件名,后缀名的操作需要使用路径名来获取文件名,目录名,绝对路径等等。使用os.path模块中的函数来操作路径名。下面是一个交互式例子来演示一些关键的特性:对于任何的文件名的操作,你都应该使用os.path模块,

    2022年7月5日
    23
  • 交换机上uplink端口的作用是什么_uplink怎么用的

    交换机上uplink端口的作用是什么_uplink怎么用的PoE交换机是如今安防行业使用很广泛的一种设备,因为它是是一种为远程交换机(如IP电话或摄像机)提供电力和数据传输的交换机,具有非常重要的作用。而在使用PoE交换机时,就有朋友咨询到,有的PoE交换机上标着PoE,另外也看到有的标着PoE+。那么,PoE交换机与PoE+有什么区别呢?接下来就由飞畅科技的小编来为大家详细介绍下吧!1、什么是PoE交换机PoE交换机由IEEE802.3af标准定义,…

    2022年10月4日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号