【K-means聚类】

这篇具有很好参考价值的文章主要介绍了【K-means聚类】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

聚类

定义:聚类是一种无监督的机器学习方法,它的主要目的是将数据集中的对象(或点)按照它们之间的相似性分组或聚类。这些聚类(或称为簇)中的对象在某种度量下是相似的,而不同聚类中的对象是不同的。简言之,聚类是将相似的对象归为一类,不同的对象归为不同的类。
常用的聚类方法及其确定和适用场景比较:

K-means聚类:

确定:基于距离的聚类,目标是使每个数据点到其所属簇的中心的距离之和最小。
适用场景:适用于球形簇,且簇的大小和形状相对接近的情况。
层次聚类:

确定:按照层次结构对数据进行聚类,可以是自底向上的(凝聚)或自顶向下的(分裂)。
适用场景:适用于各种形状和大小的簇,但需要更多的计算资源。
DBSCAN:

确定:基于密度的聚类,可以找到任意形状的簇,并可以处理噪声数据。
适用场景:适用于密度不均的簇和具有噪声的数据集。
谱聚类:

确定:基于图理论的聚类,将数据视为图中的节点,相似度视为边的权重,然后在图上执行聚类。
适用场景:适用于非凸形状的数据集和高维数据。
K-means聚类的原理和步骤:

原理:

K-means聚类是基于距离的聚类方法,其主要目标是使每个数据点到其所属簇的中心的距离之和最小。
在给定的数据集中,选择K个初始点作为簇的中心。
对于每个数据点,将其分配给最近的簇中心。
重新计算每个簇的中心(即簇内所有点的均值)。
重复步骤2和3,直到簇的中心不再发生变化或变化很小。
步骤:

初始化:选择K个数据点作为初始的簇中心。
分配步骤:对于每个数据点,计算它到各个簇中心的距离,并将其分配给最近的簇。
更新步骤:对于每个簇,重新计算其中心(即簇内所有点的均值)。
迭代:重复步骤2和3,直到满足停止条件(如簇的中心不再发生变化或变化很小,或达到预定的迭代次数)。
需要注意的是,K-means聚类方法对于初始簇中心的选择很敏感,不同的初始选择可能导致不同的聚类结果。此外,K-means只能发现球形的簇,并且需要提前指定簇的数量K。

k-means聚类代码

k-means 实现

from sklearn.cluster import KMeans
import numpy as np

# 示例数据
data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])

# 创建KMeans对象,设置聚类数为2
kmeans = KMeans(n_clusters=2)

# 拟合数据
kmeans.fit(data)

# 预测数据的类别
labels = kmeans.predict(data)

print("聚类结果:", labels)

应用:文章来源地址https://www.toymoban.com/news/detail-835778.html

from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
import os
 

def z_score(arr, threshold=3):
    mean = np.mean(arr)
    std_dev = np.std(arr)
    print('std_dev:', std_dev)
    z_scores = [(x - mean) / std_dev for x in arr]
    print('z_scores: ', z_scores)
    outliers = [i for i, z in enumerate(z_scores) if abs(z) > threshold]
    return outliers

 
def _kmeans(x, file):
    # global file
    prefix, suffix = os.path.splitext(file)
    data = x
    n_clusters = 3
    kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(data)
    for i in range(n_clusters):
        plt.scatter(data[kmeans.labels_ == i, 0], data[kmeans.labels_ == i, 1], label=f'cluster{i}')

    # 聚类中心
    plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', color='red', label='cluster center')
    print(kmeans.cluster_centers_)
    print(np.bincount(kmeans.labels_))
    
    id_count_list = list(np.bincount(kmeans.labels_))
    y_center_list = list(kmeans.cluster_centers_[:, 0])
    y_center_list_c = y_center_list.copy()
    sorted_y_list = sorted(y_center_list_c, reverse=True)
    max_count_index = id_count_list.index(max(id_count_list))
    
    y_calib_value = sorted_y_list[len(sorted_y_list)//2]
    value_index = y_center_list.index(y_calib_value)
    # 校正值,不一定在类别列表的中心
    
    front_value, end_value = sorted_y_list[len(sorted_y_list)//2 -1], sorted_y_list[len(sorted_y_list)//2 +1]
    front_index, end_index = y_center_list.index(front_value), y_center_list.index(end_value)
    pitch_list = [kmeans.cluster_centers_[:, 1][end_index], kmeans.cluster_centers_[:, 1][value_index], kmeans.cluster_centers_[:, 1][front_index]]
    
    print(pitch_list)
    # flag_list = z_score(pitch_list)
    
    flag = True
    # 比较法
    if len(pitch_list)==3:
        diff0 = np.abs(pitch_list[0]- pitch_list[1])
        diff1 = np.abs(pitch_list[0]- pitch_list[2])
        diff3 = np.abs(pitch_list[1]- pitch_list[2])
        thresh = 10
        if np.abs(diff3- diff0)>thresh or np.abs(diff3- diff1)> thresh:
            flag = False
    
    pitch_calib, yaw_calib = None, None 
    if value_index== max_count_index and flag:
        yaw_calib, pitch_calib = kmeans.cluster_centers_[max_count_index]
        print(yaw_calib.item())
        print(pitch_calib.item())
        # print(roll_calib.item())
        
        
    else:
        print('需再次采集数据标定')   
    print('=========', file) 
    plt.legend()
    plt.title(file)
    # plt.show()
    plt.savefig('runs/onnx_infer/'+ prefix+ '.png')
    plt.savefig('runs/pred/kmeans.png')
    plt.close()
    return pitch_calib, yaw_calib
  

if __name__ == '__main__':
    # 分析數據,得到校正值
    file_path = r'/home/'

    files = os.listdir(file_path)
    files = [item  for item in files if item.endswith('.txt')]
    
    for file in files:
        pt_list = []
        with open(os.path.join(file_path, file), 'r') as f:
            lines = f.read().splitlines()
            for line in lines:
                line = line.split()
                line = [float(item) for item in line]
                pt = [line[3], line[2]]
                pt_list.append(pt)

        x = np.array(pt_list)
        # 输入为[yaw, pitch] 二维数组
        pitch_calib, yaw_calib = _kmeans(x, file)

到了这里,关于【K-means聚类】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习实战:Python基于K均值K-means进行聚类(九)

    1.1 K-means的介绍 K均值( K-means )是一种基于距离度量的聚类算法,其主要思想是将数据集划分为k个不同的簇,每个簇代表一个相似度较高的数据组。该算法通过迭代优化来最小化所有数据点与其所属簇的欧氏距离之和,从而找到最佳的簇划分。 需要区分一下,K-means和KNN是两

    2024年02月16日
    浏览(26)
  • 机器学习之K-means聚类算法

    目录 K-means聚类算法 算法流程 优点 缺点 随机点聚类 人脸聚类 旋转物体聚类 K-means聚类算法是一种无监督的学习方法,通过对样本数据进行分组来发现数据内在的结构。K-means的基本思想是将n个实例分成k个簇,使得同一簇内数据相似度高而不同簇之间数据相似度低。 K-means的

    2024年02月11日
    浏览(33)
  • 【人工智能】— 无监督学习、K-means聚类(K-means clustering)、K-means损失函数,目标函数

    无监督学习是指在没有标签的数据上进行学习,即没有监督信号的指导下进行模型训练。在无监督学习中,我们主要关注从无标签数据中学习出数据的低维结构和隐藏的模式。 通过无标签数据,我们可以预测以下内容: 低维结构:通过无监督学习算法如主成分分析(PCA),

    2024年02月10日
    浏览(32)
  • 【聚类】K-Means聚类

    cluster:簇 这边暂时没有时间具体介绍kmeans聚类的原理。简单来说,就是首先初始化k个簇心;然后计算所有点到簇心的欧式距离,对一个点来说,距离最短就属于那个簇;然后更新不同簇的簇心(簇内 所有点的平均值 ,也就是簇内点的 重心 );循环往复,直至 簇心不变 或

    2024年02月09日
    浏览(25)
  • 机器学习(八) — K-means

    1 definition randomly initialize K cluster centroids μ 1 , μ 2 , ⋯ mu_1, mu_2, cdots μ 1 ​ , μ 2 ​ , ⋯ repeat: assign each point to its closest centroid μ mu μ recompute the centroids(average of the closest point) 2 optimazation objective c ( i ) c^{(i)} c ( i ) = index of cluster to which example x ( i ) x^{(i)} x ( i ) is currently assign

    2024年01月21日
    浏览(38)
  • 【K-means聚类】

    聚类 定义:聚类是一种无监督的机器学习方法,它的主要目的是将数据集中的对象(或点)按照它们之间的相似性分组或聚类。这些聚类(或称为簇)中的对象在某种度量下是相似的,而不同聚类中的对象是不同的。简言之,聚类是将相似的对象归为一类,不同的对象归为不

    2024年02月22日
    浏览(31)
  • 聚类 kmeans | 机器学习

    是一种无监督学习算法,其主要目的是 将数据点分为k个簇 ,距离近的样本具有更高的相似度,距离近的划分为一个簇,一共划分k个簇,**让簇内距离小,簇间距离大。**距离是样本点到之心的距离。所有样本点到质心距离之和最小,就认为样本越相似。 聚类和分类区别 优化

    2023年04月09日
    浏览(29)
  • 头歌(educoder)机器学习 --- k-means

    2024年02月06日
    浏览(40)
  • 【机器学习】十大算法之一 “K-means”

      作者主页: 爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主 爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域. https://blog.csdn.net/Code_and516?type=blog 个人简介:打工人。 持续分

    2024年02月10日
    浏览(35)
  • k-means聚类算法详解

    什么是特征向量? 用来描述样本点的一组数据,要和我们数学中的向量区别一下,本质来说就是个数组,数组中的每个元素代表从不同角度描述样本点的值。 K-means 是我们最常用的基于 欧式距离 的聚类算法,其认为两个目标的距离越近,相似度越大。 聚类就是对大量末知标

    2024年02月16日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包