Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python实现匈牙利匹配

python实现匈牙利匹配

作者头像
芯动大师
发布于 2024-09-30 00:11:48
发布于 2024-09-30 00:11:48
13800
代码可运行
举报
文章被收录于专栏:防止网络攻击防止网络攻击
运行总次数:0
代码可运行

现在针对某个项目,利用python实现DBSCAN和Kmeans算法。项目简介:利用某传感器可以采集场景中的点云,每一帧都可以采集数量不等的点(x,y,z)。想要利用DBSCAN和Kmeans对点云进行无监督式的聚类,并利用匈牙利匹配对不同帧的点云簇进行匹配,从而实现跟踪效果。项目备注:这是别人拜托我来写的,我花了一点点时间。从我的角度,这种方法解决该项目,简直是胡扯。。。不过,项目和人不靠谱,并不影响代码的有效性,权当一种消遣。#数据格式点云数据用csv格式文件存储,格式如下:第1行 Frame # | X | Y | Z第2行 1 -0.4 1.04 0.11第100行 1 15.4 7.45 0.16第101行 2 89.3 4.78 3.65第114行 2 34.4 6.04 0.56.........这里不贴出数据,有关数据部分的代码,可以调整为你自己所需的格式。

#DBSCAN算法代码

  • 实现功能:对点云进行DBSCAN聚类,并得到每一次聚类的点云簇的个数

加载所需的库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN  
from sklearn.preprocessing import StandardScaler

从数据中不断按帧数来读取数据,从frame_start读,最多不能超过frame_end,直到读取点的数量达到num_threshold后停止。可以理解为,自适应地读取一定数量的点云,从而使得点云总数拓充到一个可以聚类的程度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def adaption_frame(data, frame_start, frame_end, num_threshold=1000): 
    data_x = []
    data_y = []
    data_z = []
    for i in range(frame_start, frame_end):
        target_frame = i  # 替换为你想要读取的Frame值
        
        # 筛选出指定Frame值的点云数据
        table_data = data[data['Frame #'] == target_frame]

        x_arr = table_data['X'].values
        data_x = np.concatenate((data_x, x_arr), axis=0)

        y_arr = table_data['Y'].values
        data_y = np.concatenate((data_y, y_arr), axis=0)  

        z_arr = table_data['Z'].values
        data_z = np.concatenate((data_z, z_arr), axis=0)  
        
        if data_x.shape[0] > num_threshold:
            break

    return data_x, data_y, data_z

利用坐标值,简单的对点云进行去噪

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def valid_data(data_x, data_y, data_z):
    # 创建一个布尔数组,检查每个元素是否在 -22 之间  
    # 使用 & 操作符来确保 ABC 的对应元素都满足条件  
    condition = (data_x >= -5) & (data_x <= 5) & (data_y>= -5) & (data_y <= 5) & (data_z >= -5) & (data_z <= 5)  

    # 使用布尔数组来索引 ABC,过滤出满足条件的元素  
    data_x_valid = data_x[condition]  
    data_y_valid = data_y[condition]  
    data_z_valid = data_z[condition]  

    # 输出新的数组大小  
#     print("x valid shape:", data_x_valid.shape)  
#     print("y valid  shape:", data_y_valid.shape)  
#     print("z valid  shape:", data_z_valid.shape)
    
    return data_x_valid, data_y_valid, data_z_valid

用于点云的绘图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def draw_data_origin(data_x, data_y, data_z):
    # 创建3D绘图
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    # 绘制点云
    ax.scatter(data_x, data_y, data_z, s=0.1)  # s控制点的大小
    
    # 设置轴标签
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')
    ax.set_title(f'Point Cloud at Frame {1}')

    # 显示图形
    plt.show()

DBSCAN代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def dbscan(data_x, data_y, data_z):
    # 将 X, Y, Z 合并成一个二维数组  
    data_input = np.column_stack((data_x, data_y, data_z))  

    # 标准化数据(对于许多聚类算法来说,标准化是一个好习惯)  
    scaler = StandardScaler()  
    data_scaled = scaler.fit_transform(data_input)  

    # 初始化 DBSCAN,这里 eps 和 min_samples 是两个重要的参数,需要根据数据特性进行调整  
    # eps 是邻域的半径大小,min_samples 是成为核心对象所需的最小邻居数  
    dbscan = DBSCAN(eps=0.3, min_samples=5)  

    # 进行聚类  
    labels = dbscan.fit_predict(data_scaled)  

    # 计算不同标签的数量,即点簇的个数  
    num_clusters = len(set(labels)) - (1 if -1 in labels else 0)  

    return num_clusters, labels, 

对每一次的聚类结果,按照点数大小降序排列。例如:某次聚类结果分为了3类,label为2的点云簇点云数为100,label为2的点云簇点云数为30,label为3的点云簇点云数为50。结果就是对他们进行降序排列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def order_cluster(clusters_num, labels):    
    unique_labels, inverse_indices = np.unique(labels, return_inverse=True)  
    print(unique_labels.shape)
    print(inverse_indices.shape)
    # 使用 numpy.bincount 统计每个标签出现的次数  
    
    counts = np.bincount(inverse_indices) 

    # 按照出现次数降序排列  
    sorted_indices = np.argsort(counts)[::-1]  # 获取降序排列的索引  
    sorted_labels = unique_labels[sorted_indices]  # 根据索引重新排列标签  
    sorted_counts = counts[sorted_indices]  # 根据索引重新排列计数  

    # 打印结果  
    for label, count in zip(sorted_labels, sorted_counts):  
        print(f"类别 {label}: {count} 次")
    
    A = []
    for i in range(unique_labels.shape[0]):
        # 首先找到个数最多的标签  
        most_common_label = sorted_labels[i]  
        # 然后找到这个标签在原始 labels 数组中的位置  
        positions_most_common = np.where(labels == most_common_label)[0]  
        
        A.append(positions_most_common)

    return A

第一次的聚类结果,需要进行特殊的处理。认为点云数量超过human_size,才可以成为一个有效簇。用这种方式得到第一次聚类结果,存在多少个有效簇,并返回最小簇的点云数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getFirstJudge(clusters_num, labels_order, human_size):
    num = 0
    for i in range(clusters_num):
        size = labels_order[i].shape[0]
        if size > human_size:
            num = num + 1
            points_num_min = size
    return num, points_num_min

每一次的聚类结果进行处理。如果这一次的聚类结果,有某一次的点云簇点云数大于上一次的最小点数,认为簇的个数可以增加;否则更新最新的最小簇代表的点云个数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def adaption_cluster(clusters_num, labels_order, num_last, points_num_min, human_size):
    print("上一帧个数:" + str(num_last)+ " 最小的点簇:"+str(points_num_min))
    for i in range(clusters_num):
        shape = labels_order[i].shape
        if i <= num_last-1:
            if labels_order[i].shape[0] < human_size:
                num_last = i + 1
                break
            else:
                points_num_min = labels_order[i].shape
        else:
            if labels_order[i].shape[0] > human_size:
                num_last = num_last + 1
                points_num_min = labels_order[i].shape
            else:
                break;
    return num_last, points_num_min

主函数的实现流程:1.读取数据2.积累一定帧数的点云,随后聚类3.对每一次的聚类结果,进行处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    # 参数
    human_size = 100
    csv_file = 'data/1.csv'  # 替换为你的CSV文件名
    
    data = pd.read_csv(csv_file)

    frame_start = data['Frame #'][0]
    frame_end = data['Frame #'][data['Frame #'].shape[0]-1]
    
    for i in range(100000):
        frame_start = data['Frame #'][i]
        if frame_start < frame_end:
            break
    print(frame_start)
    print(frame_end)

#     frame_start = 0
#     frame_end = 120
    
    num_last = 0       # 上一帧的人数
    points_num_min = 0 # 满足此个数才是一个人
    
    flag = 0
    
    for i in range(frame_start, frame_end):
        data_x, data_y, data_z = adaption_frame(data, frame_start, frame_end, num_threshold=1000)
        data_x, data_y, data_z = valid_data(data_x, data_y, data_z)

        clusters_num, labels = dbscan(data_x, data_y, data_z)
        # draw_data_origin(data_x, data_y, data_z)
        # 使用 numpy.unique 获取唯一标签和它们在原始数组中的索引  
        
        labels_order = order_cluster(clusters_num, labels)
        print(labels_order[0].shape)
        print(labels_order[1].shape)
        
        if flag == 0:
            num_last, points_num_min = getFirstJudge(clusters_num, labels_order, human_size)
            flag = 1
        else:
            num_last, points_num_min = adaption_cluster(clusters_num, labels_order, num_last, points_num_min, human_size)

        print("第 "+str(frame_start) + " 帧有 :" + str(num_last)+" 个人")
        if frame_start + 10 > frame_end:
            break
        else:
            frame_start = frame_start + 1

#Kmeans算法代码实现功能:设定K值,对点云进行Kmeans聚类,

加载所需的包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import DBSCAN  
from sklearn.preprocessing import StandardScaler

from sklearn.cluster import KMeans  
from scipy.optimize import linear_sum_assignment  

from scipy.spatial.distance import cdist

以下代码同之前的DBSCAN一样,在这里不赘述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def adaption_frame(data, frame_start, frame_end, num_threshold=1000): 
def valid_data(data_x, data_y, data_z):
def draw_data_origin(data_x, data_y, data_z):
def dbscan(data_x, data_y, data_z):
def order_cluster(clusters_num, labels):
def getFirstJudge(clusters_num, labels_order, human_size):
def adaption_cluster(clusters_num, labels_order, num_last, points_num_min, human_size):

Kmeans进行聚类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def cluster_kmeans(value, data_x, data_y, data_z):
    data_x = data_x.reshape(-1, 1)
    data_y = data_y.reshape(-1, 1)
    data_z = data_z.reshape(-1, 1)
    # 将三个数组组合成一个(n, 3)的点云数组  
    points = np.hstack((data_x, data_y, data_z))  
    kmeans = KMeans(n_clusters=value, random_state=0).fit(points)  
    
    return kmeans

从聚类结果中,提取一些特征,用做之后的匈牙利匹配。这里,提取了三个特征:点云簇的均值、点云数、以及点云排序id

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def extract_feature(K, labels_order, data_x, data_y, data_z):
    features = []
    
    for i in range(K):
        one_feature = []
        data_x_k = data_x[labels_order[i]]
        data_y_k = data_y[labels_order[i]]   
        data_z_k = data_z[labels_order[i]]   
#         print(data_x_k.shape)
#         print(data_y_k.shape)
#         print(data_z_k.shape)
        
        x_mean = np.mean(data_x_k, axis=0)
        y_mean = np.mean(data_y_k, axis=0)
        z_mean = np.mean(data_z_k, axis=0)
        cluster_mean = np.hstack((x_mean, y_mean, z_mean))
        
        cluster_points_size = labels_order[i].shape
        
        one_feature.append(cluster_mean)
        one_feature.append(cluster_points_size)
        one_feature.append(i)
        features.append(one_feature)
        
    return features

用提取的特征进行匈牙利匹配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def hungarian_match(features_last, features_now):
    # 提取点云中心和点云数  
    centers_last = np.array([a[0] for a in features_last])  
    counts_last = np.array([a[1][0] for a in features_last])  

    centers_now = np.array([b[0] for b in features_now])  
    counts_now = np.array([b[1][0] for b in features_now])  
    
    # 计算点云中心之间的欧氏距离  
    distance_matrix = cdist(centers_last, centers_now)  

    # 定义基于点云数和距离的成本函数  
    # 这里我们简单地使用距离的倒数和点云数差异的绝对值作为成本  
    # 你可能需要根据你的具体需求来调整这个成本函数  
#     cost_matrix = 1.0 / distance_matrix + np.abs(counts_last[:, np.newaxis] - counts_now)  
    cost_matrix = np.abs(counts_last[:, np.newaxis] - counts_now) + distance_matrix * 10
    
    # 应用匈牙利算法找到最小成本匹配
    row_ind, col_ind = linear_sum_assignment(cost_matrix)  
    
    # 打印匹配结果  
    matches = [(features_last[row_ind[i]], features_now[col_ind[i]]) for i in range(len(row_ind))]  
    for match in matches:  
        print(f"Match: last={match[0][0]} (count={match[0][1][0]}), (label={match[0][2]}), now={match[1][0]} (count={match[1][1][0]}), (label={match[1][2]})")
                             
    return matches

主函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    csv_file = 'data/2.csv'  # 替换为你的CSV文件名
    K = 2
    # 参数
    human_size = 100
    
    data = pd.read_csv(csv_file)

    frame_start = data['Frame #'][0]
    frame_end = data['Frame #'][data['Frame #'].shape[0]-1]
    
    for i in range(100000):
        frame_start = data['Frame #'][i]
        if frame_start < frame_end:
            break

    frame_start = 0
    frame_end = 120
    
    num_last = 0       # 上一帧的人数
    points_num_min = 0 # 满足此个数才是一个人
    
    flag = 0    
    features_last = []

    data_x_all= [[] for _ in range(K)]
    data_y_all = [[] for _ in range(K)]
    data_z_all = [[] for _ in range(K)]

    for i in range(frame_start, frame_end):
        data_x, data_y, data_z = adaption_frame(data, frame_start, frame_end, num_threshold=1000)
        data_x, data_y, data_z = valid_data(data_x, data_y, data_z)
        
        result_kmeans = cluster_kmeans(K, data_x, data_y, data_z)
        
        # 输出每个点的label  
        labels = result_kmeans.labels_
        
        labels_order = order_cluster(K, labels)
        
        features = extract_feature(K, labels_order, data_x, data_y, data_z)
        print(features)
        
        frame_start = frame_start + 1
        
        if flag == 0:
            features_last = features
            flag = 1
            
            continue
        else:
            
            matches = hungarian_match(features_last, features)
            
            for k in range(K):
                # 第一维代表匹配对数,第二维0代表features_last,1代表features
                # 第三维代表特征维度,第四维每个特征的参数
                data_x_all[k].extend(data_x[labels_order[matches[k][0][2]]])
                data_y_all[k].extend(data_y[labels_order[matches[k][0][2]]])
                data_z_all[k].extend(data_z[labels_order[matches[k][0][2]]])
#                 print(len(data_x_all[k]))
    
            features_last = features
    
    # 创建颜色列表,这里使用RGB颜色  
    colors = ['r', 'g', 'b']  # 红色、绿色、蓝色  

    # 创建一个3D图形  
    fig = plt.figure()  
    ax = fig.add_subplot(111, projection='3d')  

    # 遍历每组数据并绘制  
    for k in range(K):  
        x = data_x_all[k]  
        y = data_y_all[k]  
        z = data_z_all[k]  
        color = colors[k % len(colors)]  # 使用循环颜色,以防K大于颜色数量  
        ax.scatter(x, y, z, c=color, label=f'Group {k+1}')  

    # 添加图例  
    ax.legend()  

    # 设置坐标轴标签  
    ax.set_xlabel('X')  
    ax.set_ylabel('Y')  
    ax.set_zlabel('Z')  

    # 显示图形  
    plt.show()

结果

以下就是匈牙利匹配后的结果。红色和绿色分别代表,经过匈牙利匹配后的点云簇,统一了时间维度画在一张图上的结果。如果需要,可以按照时间序列一步步来画,这样可以看到红色和绿色沿着各自的动线前进

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
27个Python数据科学库实战案例演示
为了大家能够对人工智能常用的 Python 库有一个初步的了解,以选择能够满足自己需求的库进行学习,对目前较为常见的人工智能库进行简要全面的介绍。
可以叫我才哥
2022/11/11
6050
27个Python数据科学库实战案例演示
通透!十大聚类算法全总结!!
这些聚类算法各有优缺点,适用于不同类型的数据和不同的应用场景。选择合适的聚类算法通常取决于具体的需求、数据的特性和计算资源。
Python编程爱好者
2023/11/28
6K0
通透!十大聚类算法全总结!!
详解DBSCAN聚类
基于密度的噪声应用空间聚类(DBSCAN)是一种无监督的ML聚类算法。无监督的意思是它不使用预先标记的目标来聚类数据点。聚类是指试图将相似的数据点分组到人工确定的组或簇中。它可以替代KMeans和层次聚类等流行的聚类算法。
deephub
2020/08/21
1.9K0
详解DBSCAN聚类
一看就懂的Tensorflow实战(K-Means模型)
K-MEANS算法是输入聚类个数k,以及包含 n个数据对象的数据库,输出满足方差最小标准k个聚类的一种算法。属于一种经典的无监督学习算法。 示意图如下所示:
AI异构
2020/07/29
2.2K0
一看就懂的Tensorflow实战(K-Means模型)
Kmeans算法的Python实现
Kmeans聚类 kmeans K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因
用户2183996
2018/06/21
8670
分群思维(四)基于KMeans聚类的广告效果分析
从雷达图我们发现四个各类别在6个数字特征上具有较大差异,0类更偏向访问深度,3类更偏向日均uv,2和3类在多个指标表现都较好,但也存在差异。
HsuHeinrich
2023/03/29
7350
分群思维(四)基于KMeans聚类的广告效果分析
机器学习第12天:聚类
某位著名计算机科学家有句话:“如果智能是蛋糕,无监督学习将是蛋糕本体,有监督学习是蛋糕上的糖霜,强化学习是蛋糕上的樱桃”
Nowl
2024/01/18
2160
机器学习第12天:聚类
[Python从零到壹] 十三.机器学习之聚类算法四万字总结(K-Means、BIRCH、树状聚类、MeanShift)
在过去,科学家会根据物种的形状习性规律等特征将其划分为不同类型的门类,比如将人种划分为黄种人、白种人和黑种人,这就是简单的人工聚类方法。聚类是将数据集中某些方面相似的数据成员划分在一起,给定简单的规则,对数据集进行分堆,是一种无监督学习。聚类集合中,处于相同聚类中的数据彼此是相似的,处于不同聚类中的元素彼此是不同的。本章主要介绍聚类概念和常用聚类算法,然后详细讲述Scikit-Learn机器学习包中聚类算法的用法,并通过K-Means聚类、Birch层次聚类及PAC降维三个实例加深读者印象。
Eastmount
2021/12/02
2.2K0
[Python从零到壹] 十三.机器学习之聚类算法四万字总结(K-Means、BIRCH、树状聚类、MeanShift)
简单易学的机器学习算法——谱聚类(Spectal Clustering)
一、复杂网络中的一些基本概念 1、复杂网络的表示 image.png 2、网络簇结构     网络簇结构(network cluster structure)也称为网络社团结构(network community structure),是复杂网络中最普遍和最重要的拓扑属性之一。网络簇是整个网络中的稠密连接分支,具有同簇内部节点之间相互连接密集,不同簇的节点之间相互连接稀疏的特征。 3、复杂网络的分类     复杂网络主要分为:随机网络,小世界网络和无标度网络。 二、谱方法介绍 1、谱方法的思想     在
felixzhao
2018/03/20
2.5K0
简单易学的机器学习算法——谱聚类(Spectal Clustering)
特征工程系列之非线性特征提取和模型堆叠
当在数据一个线性子空间像扁平饼时 PCA 是非常有用的。但是如果数据形成更复杂的形状呢?一个平面(线性子空间)可以推广到一个 流形 (非线性子空间),它可以被认为是一个被各种拉伸和滚动的表面。
墨明棋妙27
2022/09/23
1.4K0
无监督学习的集成方法:相似性矩阵的聚类
在机器学习中,术语Ensemble指的是并行组合多个模型,这个想法是利用群体的智慧,在给出的最终答案上形成更好的共识。
deephub
2023/11/13
4430
无监督学习的集成方法:相似性矩阵的聚类
机器学习之鸢尾花-聚类
将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等。
python与大数据分析
2022/03/11
7320
机器学习之鸢尾花-聚类
机器学习 | KMeans聚类分析详解
大量数据中具有"相似"特征的数据点或样本划分为一个类别。聚类分析提供了样本集在非监督模式下的类别划分。聚类的基本思想是"物以类聚、人以群分",将大量数据集中相似的数据样本区分出来,并发现不同类的特征。
数据STUDIO
2021/06/24
4.3K0
【Python】机器学习之聚类算法
这些聚类算法在不同场景和数据特性下有各自的优势和局限性,选择合适的算法取决于问题的性质和对结果的需求。聚类在图像分割、客户细分、异常检测等领域都有广泛的应用。
SarPro
2024/02/20
3290
【Python】机器学习之聚类算法
8个常见的无监督聚类方法介绍和比较
本文约4500字,建议阅读9分钟本文将全面概述Scikit-Learn库中用于的聚类技术以及各种评估方法。 无监督聚类方法的评价指标必须依赖于数据和聚类结果的内在属性,例如聚类的紧凑性和分离性,与外部知识的一致性,以及同一算法不同运行结果的稳定性。 本文将分为2个部分,1、常见算法比较 2、聚类技术的各种评估方法 本文作为第一部分将介绍和比较各种聚类算法: K-Means Affinity Propagation Agglomerative Clustering Mean Shift Clusterin
数据派THU
2023/04/03
5010
8个常见的无监督聚类方法介绍和比较
实战干货|Python数据分析消费者用户画像
基于Python Outlier Detection库进行异常值处理(Kmeans对异常值敏感)。
用户6888863
2023/11/30
1.2K0
实战干货|Python数据分析消费者用户画像
数据科学和人工智能技术笔记 十七、聚类
在 scikit-learn 中,AgglomerativeClustering使用linkage参数来确定合并策略,来最小化(1)合并簇的方差(ward),(2)来自簇对的观测点的距离均值(average) ,或(3)来自簇对的观测之间的最大距离(complete)。
ApacheCN_飞龙
2022/12/02
6700
数据科学和人工智能技术笔记 十七、聚类
K-means算法
聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中。簇内的对象越相似,聚类的效果越好。
润森
2019/08/29
1.1K0
K-means算法
【机器学习】聚类算法分类与探讨
文章链接:https://cloud.tencent.com/developer/article/2465572
小馒头学Python
2024/11/14
1920
【机器学习】聚类算法分类与探讨
Scikit-learn 秘籍 第三章 使用距离向量构建模型
这一章中,我们会涉及到聚类。聚类通常和非监督技巧组合到一起。这些技巧假设我们不知道结果变量。这会使结果模糊,以及实践客观。但是,聚类十分有用。我们会看到,我们可以使用聚类,将我们的估计在监督设置中“本地化”。这可能就是聚类非常高效的原因。它可以处理很大范围的情况,通常,结果也不怎么正常。
ApacheCN_飞龙
2022/12/01
9190
相关推荐
27个Python数据科学库实战案例演示
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档