【机器学习】无监督学习 您所在的位置:网站首页 kmeans聚类算法python代码的意义 【机器学习】无监督学习

【机器学习】无监督学习

2023-08-19 09:55| 来源: 网络整理| 查看: 265

1. K-Means算法缺点

1)对k个初始质心的选择比较敏感,容易陷入局部最小值。如下面这两种情况。K-Means也是收敛了,只是收敛到了局部最小值。 在这里插入图片描述 2)k值得选择是用户指定的,不同的k得到的结果会有挺大的不同,如下图所示,左边是k=3的结果,蓝色的簇太稀疏了,蓝色的簇应该可以再划分成两个簇。右边的是k=5的结果,红色和蓝色的簇应该合并为一个簇 在这里插入图片描述 3)存在局限性,如下面这种非球状的数据分布就搞不定了。 在这里插入图片描述 4)数据量比较大的时候,收敛会比较慢。

2. K-Means算法优化

1)使用多次的随机初始化,计算每一次建模得到的代价函数的值,选取代价函数最小结果作为聚类结果。 在这里插入图片描述 2)使用肘部法则来选择k的值。如下图所示: 在这里插入图片描述

3. 肘部法则代码实现

注:数据集在文章末尾

import numpy as np import matplotlib.pyplot as plt # 载入数据 data = np.genfromtxt("kmeans.txt", delimiter=" ") ##### 模型训练 # 计算距离 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1)**2)) # 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape # k个质心,列数跟样本的列数一样 centroids = np.zeros((k, dim)) # 随机选出k个质心 for i in range(k): # 随机选取一个样本的索引 index = int(np.random.uniform(0, numSamples)) # 作为初始化的质心 centroids[i, :] = data[index, :] return centroids # 传入数据集和k的值 def kmeans(data, k): # 计算样本个数 numSamples = data.shape[0] # 样本的属性,第一列保存该样本属于哪个簇,第二列保存该样本跟它所属簇的误差 clusterData = np.array(np.zeros((numSamples, 2))) # 决定质心是否要改变的变量 clusterChanged = True # 初始化质心 centroids = initCentroids(data, k) while clusterChanged: clusterChanged = False # 循环每一个样本 for i in range(numSamples): # 最小距离 minDist = 100000.0 # 定义样本所属的簇 minIndex = 0 # 循环计算每一个质心与该样本的距离 for j in range(k): # 循环每一个质心和样本,计算距离 distance = euclDistance(centroids[j, :], data[i, :]) # 如果计算的距离小于最小距离,则更新最小距离 if distance len(mark): print("Your k is too large!") return 1 # 画样本点 for i in range(numSamples): markIndex = int(clusterData[i, 0]) plt.plot(data[i, 0], data[i, 1], mark[markIndex]) # 用不同颜色形状来表示各个类别 mark = ['*r', '*b', '*g', '*k', '^b', '+b', 'sb', 'db', '


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有