【机器学习】无监督学习 | 您所在的位置:网站首页 › kmeans聚类算法python代码的意义 › 【机器学习】无监督学习 |
1. K-Means算法缺点
1)对k个初始质心的选择比较敏感,容易陷入局部最小值。如下面这两种情况。K-Means也是收敛了,只是收敛到了局部最小值。 1)使用多次的随机初始化,计算每一次建模得到的代价函数的值,选取代价函数最小结果作为聚类结果。 注:数据集在文章末尾 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 实验室设备网 版权所有 |