Shark源码分析(六):k-means算法

2024-04-27 00:48
文章标签 算法 分析 源码 means shark

本文主要是介绍Shark源码分析(六):k-means算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Shark源码分析(六):k-means算法

k-means算法是原型聚类算法中一个非常典型的算法。关于聚类算法,我之后应该会在博客中进行详细说明。

对于整个聚类算法来说,可以分为两类:硬聚类与软聚类。对于硬聚类,每一个数据点只能属于某一个簇。对于软聚类来说,则没有这一限制。

首先还是来看一下整个聚类算法基类。

ClusteringModel类

ClusteringModel类定义在<include/shark/Models/Clustering/ClusteringModel.h>文件中。

template <class InputT, class OutputT>
class ClusteringModel : public AbstractModel<InputT, OutputT>
{
public:typedef AbstractModel<InputT, OutputT> base_type;typedef AbstractClustering<InputT> ClusteringType;typedef typename base_type::BatchInputType BatchInputType;typedef typename base_type::BatchOutputType BatchOutputType;ClusteringModel(ClusteringType* clustering): mep_clustering(clustering){ SHARK_CHECK(clustering, "[ClusteringModel] Clustering must not be NULL"); }//稍后你可能会发现AbstractClustering类其实并没有parameterVector这一函数,其子类中是含有的,那么编译起来不会报错吗//注意到这里mep_clustering的定义类型是ClusteringType*,那么它肯定会使用到多态//只要其传入的对象中定义有parameterVector这一函数即可RealVector parameterVector() const{ return mep_clustering->parameterVector(); }void setParameterVector(RealVector const& newParameters){ mep_clustering->setParameterVector(newParameters); }std::size_t numberOfParameters() const{ return mep_clustering->numberOfParameters(); }void read(InArchive& archive){ archive & *mep_clustering; }void write(OutArchive& archive) const{ archive & *mep_clustering; }using base_type::eval;//计算数据所属簇的标签void eval(BatchInputType const& patterns, BatchOutputType& outputs,  State& state)const{eval(patterns,outputs);}protected:ClusteringType* mep_clustering; // 使用的是基类指针,方便使用多态
};

AbstractClustering类

在ClusteringModel类中你可能发现了AbstractClustering这个类,那么这个类又是干什么的呢?如果你熟悉基于原型的聚类算法的话,你应该知道,其中最重要的一点就是计算各个簇的中心,Shark中将聚类中心也包装成为一个类,而AbstractClustering类就是聚类中心类的基类。

ClusteringModel类包含了AbstractModel类和AbstractClustering类。其中只是提供了一些访问的接口,主要的数据是存储在AbstractClustering类中。

该类的定义位于<include/shark/Models/Clustering/AbstractClustering.h>文件中。

template <class InputT>
class AbstractClustering : public INameable, public IParameterizable, public ISerializable
{
public:typedef InputT InputType;typedef unsigned int OutputType;typedef typename Batch<InputType>::type BatchInputType;typedef Batch<OutputType>::type BatchOutputType;enum Feature {HAS_SOFT_MEMBERSHIP = 1,};SHARK_FEATURE_INTERFACE;//表示该聚类方法是否能进行软聚类bool hasSoftMembershipFunction()const{return m_features & HAS_SOFT_MEMBERSHIP;}//返回聚类结果中簇的数目virtual std::size_t numberOfClusters() const = 0;//计算一个数据所对应的簇的标号,有batch与非batch的重载版本//这个函数是针对硬聚类来说的,对于软聚类也有同样的版本virtual unsigned int hardMembership(InputType const& pattern) const{typename Batch<InputType>::type b = Batch<InputType>::createBatch(pattern);get(b,0) = pattern;return hardMembership(b)(0); //将非batch形式转换为batch形式进行处理}// 默认语意是返回softMembership函数返回值的最大值// 可以看出,硬聚类也是建立在软聚类之上的,只是输出最可能的簇virtual BatchOutputType hardMembership(BatchInputType const& patterns) const{std::size_t numPatterns = boost::size(patterns);RealMatrix f = softMembership(patterns); // 函数返回的应该是对每个簇的隶属度SHARK_ASSERT(f.size2() > 0);SHARK_ASSERT(f.size1() == numPatterns);BatchOutputType outputs(numPa

这篇关于Shark源码分析(六):k-means算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939111

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.