K均值聚类

K均值聚类的基本思想就是通过迭代找到K个簇的一种划分方案,使得聚类结果对应的代价函数最小,特别地,代价函数定义为各个样本距离所属的簇中心点的误差平方和。

这里的代价函数是各个点离所属类别 的中心点的距离。

缺点:容易受到初始值和离群点的影响—所以需要预处理。

K均值算法的调优:
1、数据归一化,离群点处理–因此需要预处理
为什么需要归一化:如果不进行归一化,那么均值和方差大的维度将对数据的聚类结果产生决定性的影响。没有统一单位和归一化处理的数据无法进行聚类。
2、合理选择K值,尝试不同的K值,然后画出曲线,取拐点。一般来说,K越大,误差的平方和越小,选择拐点。开始会急剧下降,然后平稳。

3、采用核函数
欧氏距离来度量LOSS,是基于假设:各个数据簇有相同的先验分布,并呈现出球形的分布。对于非凸的数据分布,引入核函数,**通过一个非线性的映射,将输入空间的数据点映射到高位的特征空间,并在新的特征空间进行聚类。**在传统的K均值失效下,引入和函数可以有效。

解释采用EM算法。—是解决概率模型中含有无法预测的隐含变量情况下的参数估计问题。
EM算法就是先固定一个变量使目标函数变为凸优化函数,然后求导得到最值,利用最优参数更新固定的变量,
进入下一个循环。

一个最直观了解 EM 算法思路的是 K-Means 算法。在 K-Means 聚类时,每个聚类簇的质心是隐含数据。我们会假设 K 个初始化质心,即 EM 算法的 E 步;然后计算得到每个样本最近的质心,并把样本聚类到最近的这个质心,即 EM 算法的 M 步。重复这个 E 步和 M 步,直到质心不再变化为止,这样就完成了 K-Means 聚类。

隐变量就是各个类别的中心,先初始化各个类别的中心,再将所有点进行归类,归类到距离最近的类中心,这样就实现了距离损失函数的极小化。然后更新类中心再次对各点进行归类…迭代,直到类别点没有更新。

改进版是K-MEANS++:
主要就是原来的K-MEANS是随机选择的初始点,这个会对结果有一定的影响,改进就是选择n个点之后,第n+1个点最好是远离之前的n个点。

https://www.geeksforgeeks.org/k-means-clustering-introduction/

def UpdateMean(n,mean,item): 
    for i in range(len(mean)): 
        m = mean[i]; 
        m = (m*(n-1)+item[i])/float(n); 
        mean[i] = round(m, 3); 
    return mean;

def FindColMinMax(items): 
    n = len(items[0]); 
    minima = [sys.maxint for i in range(n)];  # python int类型支持的最大值
    maxima = [-sys.maxint -1 for i in range(n)]; 
      
    for item in items: 
        for f in range(len(item)): 
            if (item[f] < minima[f]): 
                minima[f] = item[f]; 
              
            if (item[f] > maxima[f]): 
                maxima[f] = item[f]; 
  
return minima,maxima; 

def InitializeMeans(items, k, cMin, cMax): 
  
    # Initialize means to random numbers between 
    # the min and max of each column/feature     
    f = len(items[0]); # number of features 
    means = [[0 for i in range(f)] for j in range(k)]; 
      
    for mean in means: 
        for i in range(len(mean)): 
  
            # Set value to a random float 
            # (adding +-1 to avoid a wide placement of a mean) 
            mean[i] = uniform(cMin[i]+1, cMax[i]-1); 
  
    return means; 

def EuclideanDistance(x, y):  
    S = 0; # The sum of the squared differences of the elements  
    for i in range(len(x)):  
        S += math.pow(x[i]-y[i], 2) 
  
    #The square root of the sum 
    return math.sqrt(S) 

def Classify(means,item):  # 将点添加到距离最近的类中心。
    # Classify item to the mean with minimum distance     
    minimum = sys.maxint; 
    index = -1; 
  
    for i in range(len(means)): 
  
        # Find distance from item to mean 
        dis = EuclideanDistance(item, means[i]); 
  
        if (dis < minimum): 
            minimum = dis; 
            index = i; 
      
    return index;
     
     
def CalculateMeans(k,items,maxIterations=100000): 
  
    # Find the minima and maxima for columns 
    cMin, cMax = FindColMinMax(items); 
      
    # Initialize means at random points 
    means = InitializeMeans(items,k,cMin,cMax); 
      
    # Initialize clusters, the array to hold 
    # the number of items in a class 
    clusterSizes= [0 for i in range(len(means))]; 
  
    # An array to hold the cluster an item is in 
    belongsTo = [0 for i in range(len(items))]; 
  
    # Calculate means 
    for e in range(maxIterations): 
        # If no change of cluster occurs, halt 
        noChange = True; 
        for i in range(len(items)): 
  
            item = items[i]; 
  
            # Classify item into a cluster and update the corresponding means.         
            index = Classify(means,item); 
  
            clusterSizes[index] += 1; 
            cSize = clusterSizes[index]; 
            means[index] = UpdateMean(cSize,means[index],item);   ### 这里的update应该是放在所有点归于新的簇之后才更新均值点~~
  
            # Item changed cluster 
            if(index != belongsTo[i]): 
                noChange = False; 
  
            belongsTo[i] = index; 
  
        # Nothing changed, return 
        if (noChange): 
            break; 
  
    return means;

最后把各个点归到簇中。

def FindClusters(means,items): 
    clusters = [[] for i in range(len(means))]; # Init clusters 
      
    for item in items: 
  
        # Classify item into a cluster 
        index = Classify(means,item); 
  
        # Add item to cluster 
        clusters[index].append(item); 
  
    return clusters; 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: k均值聚类是一种常用的无监督学习算法,常用于将数据集划分为K个不同的类别。在Matlab中,可以利用k均值聚类算法对数据进行分析和聚类。 首先,需要在Matlab中加载数据集。可以使用Matlab内置的函数`load`或者`readtable`来读取数据。读取之后,应该对数据进行预处理,包括数据归一化和特征选择。 接下来,需要指定k值(即聚类的数目)。k值的选择可以通过试验和结果评估来确定。一般而言,可以通过使用一些启发式方法(如肘部法则或轮廓系数)来估计最佳的k值。 然后,可以使用Matlab内置的`kmeans`函数进行聚类。`kmeans`函数需要传入数据集和k值作为参数。此外,还可以指定其他选项,例如迭代次数、初始聚类中心等。 聚类完成后,可以通过可视化或其他方法来分析聚类结果。Matlab提供了许多可视化工具和函数,例如`scatter`、`plot`和`gscatter`等,它们可以帮助我们更好地理解聚类结果。 最后,对于聚类结果的评估,可以使用一些指标来度量聚类质量,如轮廓系数、互信息等。这些指标可以帮助我们了解聚类的效果,并与其他聚类算法进行比较。 总之,Matlab提供了丰富的函数和工具来支持k均值聚类。结合数据预处理、聚类算法、可视化和评估方法,我们可以在Matlab中进行有效的K均值聚类分析。但是需要注意的是,选择合适的k值和评估指标是进行聚类分析的关键,需要根据具体问题进行调整和选择。 ### 回答2: k均值聚类是一种常用的无监督机器学习算法,用于将数据集划分为k个不同的类别。在Matlab中,可以使用相关的工具箱或编写自定义代码来实现k均值聚类。 首先,需要确定聚类的数量k。然后,选择一组初始的聚类中心点。接下来的步骤是迭代地执行以下两个过程,直到收敛为止: 1. 分配阶段:计算每个数据点与k个聚类中心之间的距离,并将数据点分配给距离最近的聚类中心。 2. 更新阶段:根据分配结果,重新计算每个聚类的中心。这可以通过计算每个聚类中所有数据点的平均值来完成。 在Matlab中,可以使用kmeans函数来执行k均值聚类。该函数的输入参数包括数据集、聚类数量k和一些可选参数,如迭代次数和重复次数。调用kmeans函数后,它将返回聚类标签和聚类中心的坐标。 以下是一个简单的示例,展示如何使用Matlab进行k均值聚类: ```matlab % 载入数据集 load('data.mat'); % 设置聚类数量 k = 3; % 执行k均值聚类 [idx, centers] = kmeans(data, k); % 绘制聚类结果 figure; gscatter(data(:,1), data(:,2), idx); hold on; plot(centers(:,1), centers(:,2), 'k*', 'MarkerSize', 10); hold off; ``` 上述代码中,我们首先加载了一个名为'data.mat'的数据集。然后,我们设置聚类数量为3,调用kmeans函数执行k均值聚类。最后,我们使用gscatter函数将聚类结果绘制在图像上,并以星号标记表示聚类中心。 通过使用Matlab中的k均值聚类函数,我们可以轻松地进行聚类分析,并对数据集进行分类。 ### 回答3: k均值聚类是一种常用的聚类算法,主要用于将一组数据点按照其相似度划分为k个类别。Matlab是一个功能强大的数值计算和科学数据可视化软件,提供了丰富的工具和函数支持k均值聚类。 在Matlab中,可以使用k均值聚类函数kmeans实现聚类分析。该函数的基本语法如下: [idx, C] = kmeans(X, k) 其中,X是包含数据点的n×m矩阵,n表示样本数,m表示特征数;k表示要划分的类别数;idx是一个n×1的向量,表示每个数据点所属的类别;C是一个k×m的矩阵,表示每个类别的质心。 使用kmeans函数进行k均值聚类的步骤如下: 1. 准备数据:将要聚类数据整理成n×m的矩阵X,确保每个样本的特征在一行内连续排列。 2. 设置k:决定要分为多少个类别。 3. 聚类分析:调用kmeans函数进行聚类分析,将数据矩阵X和类别数k作为输入参数。函数会返回每个数据点的类别和每个类别的质心。 4. 结果分析:根据idx和C的结果对数据进行分析。idx向量表示每个数据点所属的类别,C矩阵表示每个类别的质心。 5. 结果可视化:可以使用Matlab的图形绘制功能对聚类结果进行可视化展示。 需要注意的是,k均值聚类算法对初始质心的选择较为敏感,初步聚类结果可能存在局部最优解。为了得到较好的聚类结果,可以多次运行算法,选取效果最佳的结果。 总之,Matlab提供了方便的k均值聚类函数,可以帮助用户进行数据聚类分析,并且通过图形化展示结果,更好地理解数据的特征和分类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值