网站建设专业书入门wordpress 帝国cms
news/
2025/10/9 2:33:47/
文章来源:
网站建设专业书入门,wordpress 帝国cms,wordpress pwshell,网站开发用啥语言一、K-means聚类算法
K均值聚类#xff08;K-means clustering#xff09;是一种常见的无监督学习算法#xff0c;用于将数据集中的样本划分为K个不同的类别或簇。它通过最小化样本点与所属簇中心点之间的距离来确定最佳的簇划分。
K均值聚类的基本思想如下#xff1a;
…一、K-means聚类算法
K均值聚类K-means clustering是一种常见的无监督学习算法用于将数据集中的样本划分为K个不同的类别或簇。它通过最小化样本点与所属簇中心点之间的距离来确定最佳的簇划分。
K均值聚类的基本思想如下
随机选择K个初始聚类中心质心。对于每个样本计算其与各个聚类中心之间的距离并将样本分配到距离最近的聚类中心所代表的簇。对于每个簇计算簇中样本的均值并将该均值作为新的聚类中心。重复步骤2和步骤3直到聚类中心不再变化或达到预定的迭代次数。
K均值聚类的关键是如何选择初始的聚类中心。常见的方法是随机选择数据集中的K个样本作为初始聚类中心或者使用一些启发式的方法来选择。
K均值聚类的优点包括简单易实现、计算效率高和可扩展性好。它在许多领域中被广泛应用如数据分析、图像处理、模式识别等。然而K均值聚类也存在一些限制例如对于初始聚类中心的敏感性、对于离群值的影响较大以及需要事先指定簇的个数K等。
在实际应用中可以根据实际问题和数据集的特点来选择合适的K值并进行多次运行以获得更稳定的结果。此外K均值聚类也可以与其他算法相结合如层次聚类hierarchical clustering和密度聚类density-based clustering以获得更好的聚类效果。
总的来说K均值聚类是一种常用的无监督学习算法用于将数据集中的样本划分为K个簇。它简单而高效适用于许多聚类问题。然而在使用K均值聚类时需要注意选择初始聚类中心和合适的K值以及对其限制和局限性的认识。
二、基于weka手工实现K-means聚类算法
package weka.clusterers.myf;import weka.clusterers.RandomizableClusterer;
import weka.core.*;import java.util.*;/*** author YFMan* Description 自定义的 KMeans 聚类器* Date 2023/6/8 15:01*/
public class myKMeans extends RandomizableClusterer {// 聚类中心的数量private int m_NumClusters 2;// 不同聚类中心的集合private Instances m_ClusterCentroids;// 聚类的最大迭代次数private int m_MaxIterations 500;// 追踪收敛前完成的迭代次数private int m_Iterations 0;// 构造函数public myKMeans() {super();// 设置随机种子m_SeedDefault 10;setSeed(m_SeedDefault);}/** Author YFMan* Description //基类定义的接口必须要实现* Date 2023/6/8 16:37* Param []* return weka.core.Capabilities**/Overridepublic Capabilities getCapabilities() {Capabilities result super.getCapabilities();result.disableAll();result.enable(Capabilities.Capability.NO_CLASS);// attributesresult.enable(Capabilities.Capability.NOMINAL_ATTRIBUTES);result.enable(Capabilities.Capability.NUMERIC_ATTRIBUTES);result.enable(Capabilities.Capability.MISSING_VALUES);return result;}/** Author YFMan* Description //进行聚类* Date 2023/6/8 16:38* Param [data 用于聚类的数据集]* return void**/Overridepublic void buildClusterer(Instances instances) throws Exception {// 迭代次数m_Iterations 0;// 初始化聚类中心m_ClusterCentroids new Instances(instances, m_NumClusters);// 每个样本属于哪个聚类中心int[] clusterAssignments new int[instances.numInstances()];// 伪随机数生成器Random RandomO new Random(getSeed());int instIndex;HashSetInstance initC new HashSet();// 初始化聚类中心随机选择 m_NumClusters 个样本作为聚类中心for (int j instances.numInstances() - 1; j 0; j--) {instIndex RandomO.nextInt(j 1);if (!initC.contains(instances.instance(instIndex))) {m_ClusterCentroids.add(instances.instance(instIndex));initC.add(instances.instance(instIndex));}instances.swap(j, instIndex);if (m_ClusterCentroids.numInstances() m_NumClusters) {break;}}boolean converged false;// 用于存储每个聚类中心的样本集合Instances[] tempI new Instances[m_NumClusters];while (!converged) {m_Iterations;converged true;// 计算每个样本 属于哪个聚类中心for (int i 0; i instances.numInstances(); i) {Instance toCluster instances.instance(i);int newC clusterInstance(toCluster);// 如果样本所属的聚类中心发生变化则说明还没有收敛if (newC ! clusterAssignments[i]) {converged false;}clusterAssignments[i] newC;}// 重新计算聚类中心m_ClusterCentroids new Instances(instances, m_NumClusters);for (int i 0; i m_NumClusters; i) {tempI[i] new Instances(instances, 0);}for (int i 0; i instances.numInstances(); i) {tempI[clusterAssignments[i]].add(instances.instance(i));}// 重新计算聚类中心for (int i 0; i m_NumClusters; i) {// 计算每个属性的平均值m_ClusterCentroids.add(calculateCentroid(tempI[i]));}// 如果迭代次数达到最大值则强制结束if (m_Iterations m_MaxIterations) {converged true;}}}/** Author YFMan* Description //计算某个聚类中心的中心点* Date 2023/6/8 16:57* Param [instances 聚类中心的样本集合]* return weka.core.Instance 聚类中心的中心点**/private Instance calculateCentroid(Instances instances) {int numInst instances.numInstances();int numAttr instances.numAttributes();Instance centroid new Instance(numAttr);double sum;for (int i 0; i numAttr; i) {sum 0;for (int j 0; j numInst; j) {sum instances.instance(j).value(i);}centroid.setValue(i, sum / numInst);}return centroid;}/** Author YFMan* Description //计算两个属性全为数值类型的样本之间的距离欧式距离* Date 2023/6/8 16:47* Param [first 第一个样例, second 第二个样例]* return double**/private double distance(Instance first, Instance second) {// 定义欧式距离double euclideanDistance 0;// 定义overlapping距离double overlappingDistance 0;for (int index 0; index first.numAttributes(); index) {if (index first.classIndex()) {continue;}// 如果是数值类型的属性则计算欧式距离if (first.attribute(index).isNumeric()) {double dis first.value(index) - second.value(index);euclideanDistance dis * dis;} else {// 如果是标称类型的属性则计算是否相等if (first.value(index) ! second.value(index)) {overlappingDistance 1;}}}return Math.sqrt(euclideanDistance) overlappingDistance;}/** Author YFMan* Description //对一个给定的样例进行分类* Date 2023/6/8 16:50* Param [instance 给定的样例]* return int 返回样例所属的聚类中心id**/Overridepublic int clusterInstance(Instance instance) throws Exception {double minDist Double.MAX_VALUE;int bestCluster 0;for (int i 0; i m_NumClusters; i) {double dist distance(instance, m_ClusterCentroids.instance(i));if (dist minDist) {minDist dist;bestCluster i;}}return bestCluster;}/** Author YFMan* Description //返回聚类中心的数量* Date 2023/6/8 16:34* Param []* return int**/Overridepublic int numberOfClusters() throws Exception {return m_NumClusters;}/** Author YFMan* Description //主函数* Date 2023/6/8 16:33* Param [argv 命令行参数]* return void**/public static void main(String[] argv) {runClusterer(new myKMeans(), argv);}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/932147.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!