首页 > 编程语言 >瞎聊机器学习——K-均值聚类(K-means)算法

瞎聊机器学习——K-均值聚类(K-means)算法

时间:2023-02-21 17:11:09浏览次数:38  
标签:瞎聊 set center means 算法 points 聚类


本文中我们将会聊到一种常用的无监督学习算法——K-means。

1、K-means算法的原理

K-means算法是一种迭代型的聚类算法,在算法中我们首先要随机确定K个初始点作为质心,然后去计算其他样本距离每一个质心的距离,将该样本归类为距离最近的一个质心所属类别中(一个簇中)。

举个例子来表述一下:

瞎聊机器学习——K-均值聚类(K-means)算法_Python

如图所示,我们进行反向思考,我设定四个固定的随机点的位置(红色点),在每一个点的附近都随机生成50个蓝色点,对所有的蓝色点进行聚类分析,如果设定簇的数量为4个(K=4),是不是最后的结果越靠近这四个红色的点越好呢?当然在寻找最优解的过程中图中的每一个蓝色的点都可以当做要选取的质心,我们进行的是一个迭代求解的过程,下面说一下K-means算法的步骤:

(1)随机选取数据中的K个对象作为聚类中心,每个对象都代表一个类(K个类的确定);

(2)计算每一个样本到每一个聚类中心的距离(欧氏距离),将该样本分到距离最近的那个类的簇中;

(3)遍历每一个簇,算出每个簇的中心,将该中心作为新的聚类中心;

(4)重复进行(2)(3),直到聚类中心不再发生变化为止。

2、K-means算法的优缺点

优点:对于聚类算法来说K-means算法原理简单;计算复杂度是O(NKt),N为数据对象的数目,K是聚类中心的数目,t是迭代的次数;对于大数据集的处理,K-means算法具有可伸缩性和高效性。

缺点:需要预先设定K值,K值得设定和真实的数据样本未必是吻合的;求解的结果是局部最优而非全局最优(当数据簇的分布差异较大时表现的不好);容易受到噪声点的影响;样本最后只能被分到单一的类别中。

3、K-means算法中K值的选择

K值得选择是K-means算法中最大的问题之一,也是该算法的主要缺点所在,然而K值的选择一般都要基于经验和多次试验的结果,我们可以将不同K值下的平均距离进行绘图:

瞎聊机器学习——K-均值聚类(K-means)算法_K-means_02

根据图片我们可以看出当K=(1~4)时,K值下的平均距离急速下降,当K>4时,曲线趋于平稳,此时我们可以认为K=4就是最佳的K值。

4、K-means算法的代码实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 先在四个中心点附近产生一堆数据
real_center = [(1, 1), (1, 2), (2, 2), (2, 1)]
point_number = 50

points_x = []
points_y = []
k_x = []
k_y = []
for center in real_center:
offset_x, offset_y = np.random.randn(point_number) * 0.3, np.random.randn(point_number) * 0.25
x_val, y_val = center[0] + offset_x, center[1] + offset_y
k_x.append(center[0])
k_y.append(center[1])
points_x.append(x_val)
points_y.append(y_val)

points_x = np.concatenate(points_x) # 将二维数组拼接成一个list
points_y = np.concatenate(points_y)


# plt.scatter(k_x,k_y,c='r')
# plt.scatter(points_x, points_y, c='b')
# plt.show()

def k_means(K, p_list, center):
points_set = {key: [] for key in range(K)}
for p in p_list:
# np.argmin返回(距离)最小值的下标,参数axis=1
nearest_index = np.argmin(np.sum((centeroid - p) ** 2, axis=1) ** 0.5)
points_set[nearest_index].append(p)
# point_set = {0:[([x1,y1]),([x2,y2]),......],1:[],......}
for k_index, p_set in points_set.items():
p_xs = [p[0] for p in p_set]
p_ys = [p[1] for p in p_set]
center[k_index, 0] = sum(p_xs) / len(p_set)
center[k_index, 1] = sum(p_ys) / len(p_set)
return center, points_set


K = 4
# 用np.stack将points_x和points_y拼接,变成(x,y)的坐标形式 p_list.shape(200,2)
p_list = np.stack([points_x, points_y], axis=1)
# 通过choice函数随机选出K个聚类中心
index = np.random.choice(len(p_list), size=K)
centeroid = p_list[index]
print(centeroid)
k_means(K, p_list, centeroid)

for i in range(10):
center, point_set = k_means(K, p_list, centeroid)
print(center) # 输出聚类中心
print(point_set) # 输出聚类后的每个簇

# 利用Sklearn中的kmeans绘制出K值及其聚类簇中平均距离的折线图,取得最佳K值
# loss = []
# for i in range(1, 10):
# kmeans = KMeans(n_clusters=i, max_iter=100).fit(p_list)
# loss.append(kmeans.inertia_ / point_number / K)
#
# plt.plot(range(1, 10), loss)
# plt.show()

 

标签:瞎聊,set,center,means,算法,points,聚类
From: https://blog.51cto.com/u_15969421/6076758

相关文章

  • 瞎聊机器学习——准确率、精确率、召回率、F1 score
    针对分类、回归、排序等问题的模型评估,不同的问题有不同的评估方法,今天重点来说一下关于分类问题的准确率(Accuracy)、精确率(precision)、召回率(Recall)、F1score。准确率(Accur......
  • 瞎聊机器学习——集成学习
    什么是集成学习?对于一个机器学习问题,通常我们有两种策略,一种是研发人员尝试各种模型,选择其中表现最好的模型进行调参优化;另一种策略就是将多个分类器的结果统一成一个最终的......
  • 基于kmeans算法的数据聚类matlab仿真
    1.算法描述聚类算法也许是机器学习中“新算法”出现最多、最快的领域,一个重要的原因是聚类不存在客观标准,给定数据集总能从某个角度找到以往算法未覆盖的某种标准从而设计......
  • 基于kmeans算法的数据聚类matlab仿真
    1.算法描述       聚类算法也许是机器学习中“新算法”出现最多、最快的领域,一个重要的原因是聚类不存在客观标准,给定数据集总能从某个角度找到以往算法未覆盖的某......
  • 机器学习-Kmeans
    前言K-means是一种经典的无监督学习算法,用于对数据进行聚类。K-means算法将数据集视为具有n个特征的n维空间,并尝试通过最小化簇内平方误差的总和来将数据点划分为簇。本文......
  • k-means学习笔记
    算法思想k-means算法是一种聚类分析算法,通过不断地迭代求解实现对样本的分类,其中k代表的是样本的类别数。k-means对样本按相似性进行分簇,其基本思想是让簇内的样本点更“......
  • R语言k-Shape时间序列聚类方法对股票价格时间序列聚类|附代码数据
    原文链接:http://tecdat.cn/?p=3726最近我们被客户要求撰写关于时间序列聚类的研究报告,包括一些图形和统计输出。本文我们将使用k-Shape时间序列聚类方法检查与我们有业......
  • R语言Apriori关联规则、kmeans聚类、决策树挖掘研究京东商城网络购物用户行为数据可视
    全文链接:http://tecdat.cn/?p=30360最近我们被客户要求撰写关于网络购物的研究报告,包括一些图形和统计输出。随着网络的迅速发展,依托于网络的购物作为一种新型的消费方式......
  • 机器学习-无监督学习-聚类
    聚类的定义聚类是一种非监督学习任务,其目的是发现数据中隐含的结构。 相似度度量样本之间的相似性对聚类的结果很关键,在聚类的时候,是根据相似度来聚类的。定义距离参......
  • 使用谱聚类(spectral clustering)进行特征选择
    在本文中,我们将介绍一种从相关特征的高维数据中选择或提取特征的有用方法。谱聚类是一种基于图论的聚类方法,通过对样本数据的拉普拉斯矩阵的特征向量进行聚类,从而达到对样......