Day 56 kMeans 聚类

news2024/11/16 21:32:14

代码:

package dl;

import java.io.FileReader;
import java.util.Arrays;
import java.util.Random;
import weka.core.Instances;

/**
 * kMeans clustering.
 */
public class kMeans {

    /**
     * Manhattan distance.
     */
    public static final int MANHATTAN = 0;

    /**
     * Euclidean distance.
     */
    public static final int EUCLIDEAN = 1;

    /**
     * The distance measure.
     */
    public int distanceMeasure = EUCLIDEAN;

    /**
     * A random instance;
     */
    public static final Random random = new Random();

    /**
     * The data.
     */
    Instances dataset;

    /**
     * The number of clusters.
     */
    int numClusters = 2;

    /**
     * The clusters.
     */
    int[][] clusters;


    /**
     *******************************
     * The first constructor.
     *
     * @param paraFilename
     *            The data filename.
     *******************************
     */
    public kMeans(String paraFilename) {
        dataset = null;
        try {
            FileReader fileReader = new FileReader(paraFilename);
            dataset = new Instances(fileReader);
            fileReader.close();
        } catch (Exception ee) {
            System.out.println("Cannot read the file: " + paraFilename + "\r\n" + ee);
            System.exit(0);
        } // Of try
    }// Of the first constructor

    /**
     *******************************
     * A setter.
     *******************************
     */
    public void setNumClusters(int paraNumClusters) {
        numClusters = paraNumClusters;
    }// Of the setter

    /**
     *********************
     * Get a random indices for data randomization.
     *
     * @param paraLength
     *            The length of the sequence.
     * @return An array of indices, e.g., {4, 3, 1, 5, 0, 2} with length 6.
     *********************
     */
    public static int[] getRandomIndices(int paraLength) {
        int[] resultIndices = new int[paraLength];

        // Step 1. Initialize.
        for (int i = 0; i < paraLength; i++) {
            resultIndices[i] = i;
        } // Of for i

        // Step 2. Randomly swap.
        int tempFirst, tempSecond, tempValue;
        for (int i = 0; i < paraLength; i++) {
            // Generate two random indices.
            tempFirst = random.nextInt(paraLength);
            tempSecond = random.nextInt(paraLength);

            // Swap.
            tempValue = resultIndices[tempFirst];
            resultIndices[tempFirst] = resultIndices[tempSecond];
            resultIndices[tempSecond] = tempValue;
        } // Of for i

        return resultIndices;
    }// Of getRandomIndices

    /**
     *********************
     * The distance between two instances.
     *
     * @param paraI
     *            The index of the first instance.
     * @param paraArray
     *            The array representing a point in the space.
     * @return The distance.
     *********************
     */
    public double distance(int paraI, double[] paraArray) {
        int resultDistance = 0;
        double tempDifference;
        switch (distanceMeasure) {
            case MANHATTAN:
                for (int i = 0; i < dataset.numAttributes() - 1; i++) {
                    tempDifference = dataset.instance(paraI).value(i) - paraArray[i];
                    if (tempDifference < 0) {
                        resultDistance -= tempDifference;
                    } else {
                        resultDistance += tempDifference;
                    } // Of if
                } // Of for i
                break;

            case EUCLIDEAN:
                for (int i = 0; i < dataset.numAttributes() - 1; i++) {
                    tempDifference = dataset.instance(paraI).value(i) - paraArray[i];
                    resultDistance += tempDifference * tempDifference;
                } // Of for i
                break;
            default:
                System.out.println("Unsupported distance measure: " + distanceMeasure);
        }// Of switch

        return resultDistance;
    }// Of distance

    /**
     *******************************
     * Clustering.
     *******************************
     */
    public void clustering() {
        int[] tempOldClusterArray = new int[dataset.numInstances()];
        tempOldClusterArray[0] = -1;
        int[] tempClusterArray = new int[dataset.numInstances()];
        Arrays.fill(tempClusterArray, 0);
        double[][] tempCenters = new double[numClusters][dataset.numAttributes() - 1];

        // Step 1. Initialize centers.
        int[] tempRandomOrders = getRandomIndices(dataset.numInstances());
        for (int i = 0; i < numClusters; i++) {
            for (int j = 0; j < tempCenters[0].length; j++) {
                tempCenters[i][j] = dataset.instance(tempRandomOrders[i]).value(j);
            } // Of for j
        } // Of for i

        int[] tempClusterLengths = null;
        while (!Arrays.equals(tempOldClusterArray, tempClusterArray)) {
            System.out.println("New loop ...");
            tempOldClusterArray = tempClusterArray;
            tempClusterArray = new int[dataset.numInstances()];

            // Step 2.1 Minimization. Assign cluster to each instance.
            int tempNearestCenter;
            double tempNearestDistance;
            double tempDistance;

            for (int i = 0; i < dataset.numInstances(); i++) {
                tempNearestCenter = -1;
                tempNearestDistance = Double.MAX_VALUE;

                for (int j = 0; j < numClusters; j++) {
                    tempDistance = distance(i, tempCenters[j]);
                    if (tempNearestDistance > tempDistance) {
                        tempNearestDistance = tempDistance;
                        tempNearestCenter = j;
                    } // Of if
                } // Of for j
                tempClusterArray[i] = tempNearestCenter;
            } // Of for i

            // Step 2.2 Mean. Find new centers.
            tempClusterLengths = new int[numClusters];
            Arrays.fill(tempClusterLengths, 0);
            double[][] tempNewCenters = new double[numClusters][dataset.numAttributes() - 1];
            // Arrays.fill(tempNewCenters, 0);
            for (int i = 0; i < dataset.numInstances(); i++) {
                for (int j = 0; j < tempNewCenters[0].length; j++) {
                    tempNewCenters[tempClusterArray[i]][j] += dataset.instance(i).value(j);
                } // Of for j
                tempClusterLengths[tempClusterArray[i]]++;
            } // Of for i

            // Step 2.3 Now average
            for (int i = 0; i < tempNewCenters.length; i++) {
                for (int j = 0; j < tempNewCenters[0].length; j++) {
                    tempNewCenters[i][j] /= tempClusterLengths[i];
                } // Of for j
            } // Of for i

            System.out.println("Now the new centers are: " + Arrays.deepToString(tempNewCenters));
            tempCenters = tempNewCenters;
        } // Of while

        // Step 3. Form clusters.
        clusters = new int[numClusters][];
        int[] tempCounters = new int[numClusters];
        for (int i = 0; i < numClusters; i++) {
            clusters[i] = new int[tempClusterLengths[i]];
        } // Of for i

        for (int i = 0; i < tempClusterArray.length; i++) {
            clusters[tempClusterArray[i]][tempCounters[tempClusterArray[i]]] = i;
            tempCounters[tempClusterArray[i]]++;
        } // Of for i

        System.out.println("The clusters are: " + Arrays.deepToString(clusters));
    }// Of clustering

    /**
     ********************
     * A testing method.
     ********************
     */
    public static void testClustering() {
        kMeans tempKMeans = new kMeans("C:\\Users\\86183\\IdeaProjects\\deepLearning\\src\\main\\java\\resources\\iris.arff");
        tempKMeans.setNumClusters(3);
        tempKMeans.clustering();
    }// Of testClustering

    /**
     ****************
     * The entrance of the program.
     *
     * @param args
     *            Not used now.
     ****************
     */
    public static void main(String args[]) {
        testClustering();
    }// Of main

}// Of class kMeans

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

react中基于腾讯地图的地图选点,地址搜索逆向定位获取经纬度

react中基于腾讯地图的地图选点&#xff0c;地址搜索逆向定位获取经纬度 效果示例图地图组件tencentMap/index.jsx样式map.scss 使用案例 效果示例图 地图组件tencentMap/index.jsx import { useEffect, useRef, useState } from "react"; import "./map.scss&…

PHP函数、数组和错误处理:简单实用的开发技巧和错误处理方法

目录 PHP函数 函数的基本概念&#xff1a; 函数定义语法&#xff1a; 函数命名关系&#xff1a; 参数详解 形参 实参 ​编辑 默认值 引用传递 函数体 函数返回值 作用域 静态变量 可变函数 匿名函数 基本概念 闭包 伪类型 库函数 有关输出的函数 有关时间…

Linux守护进程详解、范例演示 ( 6 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the…

gitee 上传、下载代码

gitee push 代码 四步走 $ git add . $ git commit -m "修改了什么东西&#xff0c;改了哪个bug&#xff0c;加了一条long服务" $ git remote add origin https://gitee.com/666666666666666666.git $ git push -u origin master1. 先安装git &#xff0c;自行百度 …

大数据到底要学习一些什么内容

大数据本质上是海量数据。 以往的数据开发&#xff0c;需要一定的Java基础和工作经验&#xff0c;门槛高&#xff0c;入门难。 如果零基础入门数据开发行业的小伙伴&#xff0c;可以从Python语言入手。 Python语言简单易懂&#xff0c;适合零基础入门&#xff0c;在编程语言…

Spring Boot 中的 @CachePut 注解是什么,原理,如何使用

Spring Boot 中的 CachePut 注解是什么&#xff0c;原理&#xff0c;如何使用 简介 在 Spring Boot 中&#xff0c;CachePut 注解是用于缓存的注解之一&#xff0c;用于更新缓存中的数据。相比于 Cacheable 注解&#xff0c;CachePut 注解可以用于更新缓存中的数据&#xff0…

鞍山万象汇钢都夜巷3.0炫目回归——“钢刚好”遇见快乐

6月21日晚&#xff0c;鞍山万象汇钢都夜巷3.0市集快意回归&#xff0c;盛大启幕。在清爽宜人的晚风里、在热烈肆意的旋律中&#xff0c;这一场以快乐为基调的暑期市集&#xff0c;正式奏响钢都夏夜狂欢的乐章。汇聚多元场景&#xff0c;搜罗热门美食&#xff0c;消解盛夏酷暑&a…

VORS、CCDM模型、GeoDetector、GWR模型集成技术在城镇化与生态系统健康空间关系分析及影响效应中的应用

城市群是一国经济发展水平的象征&#xff0c;也是一国经济发展到一定阶段的标志&#xff0c;我国城市群建设体量不断增加&#xff0c;将成为全球经济的核心&#xff0c;中国城市群的建设逐步引领全球进入到了21世纪的中国新时代。然而&#xff0c;高速的城镇化发展&#xff0c;…

DBeaver使用ssh隧道远程连接

1&#xff0c;ssh 隧道的作用 SSH 隧道&#xff08;SSH tunnel&#xff09;是通过安全外壳协议&#xff08;SSH&#xff09;在公共网络上创建一个安全的通信通道的技术。它的作用是加密和保护数据通信&#xff0c;同时允许在不安全的网络环境中安全地传输数据。 以下是一些 SS…

《一步到位,走进一站式服务治理时代:Redis管理16个数据库的最佳实践》

目录 1. 我们为什么要使用Redis缓存数据库&#xff1f; 2. 关系型与非关系型数据库有哪些区别&#xff1f; 3. Redis中的缓存问题与解决方案&#xff1a;穿透、击穿、雪崩 4. 为什么要在一个项目中使用/管理16个数据库呢&#xff1f; 5. 使用16个数据库比使用1个数据库的…

OpenStack(T版)——网络(Neutron)服务介绍与安装

文章目录 OpenStack(T版)——网络(Neutron)服务介绍与安装安装和配置(controller)准备(1)创建数据库(2)加载admin user的环境变量(3)创建服务凭证 配置Neutron网络服务组件(1)安装软件(2)编辑文件/etc/neutron/neutron.conf&#xff0c;完成以下操作(3)配置Layer 2 (ML2)plug-i…

时序数据库 TDengine 与腾讯云多个产品线完成兼容性互认证明

随着数字经济蓬勃发展&#xff0c;数据成为驱动企业数字化转型的关键生产要素&#xff0c;如何加强对数据资源的治理利用、实现数据洞察、激活数据价值正成为亟待解决的问题。在此背景下&#xff0c;数据库与操作系统、云平台等国产化软件相互结合赋能成为解决问题的思路之一。…

Java中的String类真的不可变吗?java面试常见问题

其实在Java中&#xff0c;String类被final修饰&#xff0c;主要是为了保证字符串的不可变性&#xff0c;进而保证了它的安全性。那么final到底是怎么保证字符串安全性的呢&#xff1f;接下来就让我们一起来看看吧。 一. final的作用 1. final关键词修饰的类不可以被其他类继承…

车载通讯USB开发,增强车内娱乐体验

车载通讯开发中使用的 USB 协议常见于车内娱乐系统、车载设备和汽车诊断工具等应用。USB&#xff08;Universal Serial Bus&#xff0c;通用串行总线&#xff09;是一种常见的数字通信接口标准&#xff0c;用于连接计算机、外部设备及其他电子设备之间的数据传输和通信。 USB …

Python面向对象编程到底怎么用才是最好的(两个小案例告诉你其中优势)

目录 前言案例一&#xff1a;图书管理系统案例二&#xff1a;汽车制造系统 总结 前言 大家好&#xff0c;我是辣条哥~ 当谈到Python编程语言时&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一个重要的概念。 OOP是一种…

Leetcode52 N 皇后 II

n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2 解释&#xff1a;如上图所示&…

uin-app项目实现pdf文件预览以及下载

由于项目需要&#xff0c;需要对于pdf格式的文件进行预览由用户进行选择性下载&#xff0c;查阅相关文档后方知针对于这种 pdf.js有奇效 一、下载 官网地址https://mozilla.github.io/pdf.js/getting_started/#download 文档下载解压成功后&#xff0c;按照这种格式放入uin-…

认识GBK编码和UTF-8编码

GBK编码和UTF-8编码是两种不同的字符编码方式&#xff1b; 1、主要区别如下&#xff1a; &#xff08;1&#xff09;字符集范围不同&#xff1a;GBK编码支持中文字符和日韩字符&#xff0c;而UTF-8编码支持全球范围内的字符&#xff1b; &#xff08;2&#xff09;编码方式不…

4.28 poll API介绍及代码编写

4.28 poll API介绍及代码编写 #include <poll.h> struct pollfd{int fd;//委托内核检测的文件描述符short events;//委托内核检测文件描述符的什么事件short revents;//文件描述符实际发生的事件 }; int poll(struct pollfd *fds,nfds_t nfds,int timeout);-参数&#x…

EDA云实证Vol.13:暴力堆机器之王——Calibre

Siemens的Calibre是业内权威的版图验证软件&#xff0c;被各大Foundry厂广泛认可。用户可以直接在Virtuoso界面集成Calibre接口&#xff0c;调用版图验证结果数据&#xff0c;使用起来极为方便。 今天&#xff0c;我们就来聊聊这款软件。 版图验证是芯片设计中非常重要的一环…