基于weka手工實現K-means

一、K-means聚類算法

K均值聚類(K-means clustering)是一種常見的無監督學習算法,用于將數據集中的樣本劃分為K個不同的類別或簇。它通過最小化樣本點與所屬簇中心點之間的距離來確定最佳的簇劃分。

K均值聚類的基本思想如下:

  1. 隨機選擇K個初始聚類中心(質心)。
  2. 對于每個樣本,計算其與各個聚類中心之間的距離,并將樣本分配到距離最近的聚類中心所代表的簇。
  3. 對于每個簇,計算簇中樣本的均值,并將該均值作為新的聚類中心。
  4. 重復步驟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;HashSet<Instance> 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.pswp.cn/news/34803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34803.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【快應用】list組件如何區分滑動的方向?

【關鍵詞】 list組件、滑動方向、scroll 【問題背景】 有cp反饋list這個組件在使用的時候&#xff0c;不知道如何區分它是上滑還是下滑。 【問題分析】 list組件除了通用事件之外&#xff0c;還提供了scroll、scrollbottom、scrolltop、scrollend、scrolltouchup事件&#x…

UIE在實體識別和關系抽取上的實踐

近期有做信息抽取的需求&#xff0c;UIE在信息抽取方面效果不錯。 模型準備 huggingface上下載UIE模型&#xff1a;PaddlePaddle/uie-base Hugging Face 點擊“Clone Repository”&#xff0c;確定git clone的鏈接 其中包含大文件&#xff0c;需要在windows安裝git-lfs&am…

九、多態(1)

本章概要 向上轉型回顧 忘掉對象類型 轉機 方法調用綁定產生正確的行為可擴展性陷阱&#xff1a;“重寫”私有方法陷阱&#xff1a;屬性與靜態方法 多態是面向對象編程語言中&#xff0c;繼數據抽象和繼承之外的第三個重要特性。 多態提供了另一個維度的接口與實現分離&…

C++_模板初階

在面向對象中&#xff0c;我們可以使用重載來實現多態。 但是問題在于&#xff0c;重載的函數僅僅是類型不同&#xff0c;代碼復用率比較低&#xff0c;只要有新的類型出現時&#xff0c;就要增加對應的函數&#xff1b;另一方面它的代碼可維護性比較低&#xff0c;一個出錯可…

java實現文件的下載

系統日志的獲取不可能每次都登錄服務器&#xff0c;所以在頁面上能夠下載系統運行的日志是必須的 如何來實現日志的下載&#xff0c;這樣的一個功能 前端我們用到的是window.open(...)這樣可以發送一個get請求到后臺 后臺接收到get請求之后&#xff0c;如何實現對文件的下載 R…

ubuntu中redis+mysql安裝使用

pip -V 回車&#xff08;大寫V&#xff09;&#xff1a;python包庫安裝路徑 python -m site: python查找路徑 1、redis ubuntu安裝redis System has not been booted with systemd as init system (PID 1). Cant operate&#xff1b;該問題是systemctl start redis報錯&#…

ZLMediaKit(webrtc)在linux上(CentOS7)部署與啟動

一.ZLMediaKit(webrtc)在CentOS7部署與啟動 # 1. 卸載舊版本 yum remove git # 2. 安裝 yum 源的 Git 版本 yum install -y git # 3. 查看版本 git version # 輸出 git version 1.8.3.1配置全局環境變量 # 1. 編輯配置文件 vim /etc/profile # 2. 在 /etc/profile 文件中末尾…

用 Rufus 制作 Ubuntu 系統啟動盤時,選擇分區類型為MBR還是GPT?

當使用 Rufus 制作 Ubuntu 系統啟動盤時&#xff0c;您可以根據您的需求選擇分區類型&#xff0c;MBR&#xff08;Master Boot Record&#xff09;還是 GPT&#xff08;GUID Partition Table&#xff09;。 MBR 是傳統的分區表格式&#xff0c;適用于大多數舊版本的操作系統和舊…

2023/08/13_____JMM JAVA Memory Model JAVA內存模型

JMM JAVA Memory Model java內存模型 作用&#xff1a;緩存一致性協議&#xff0c;用于定義數據讀寫的規則&#xff08;遵守&#xff0c;找到這個規則&#xff09; JMM定義了線程2工作內存和主內存之間的抽象關系&#xff1a;線程之間的共享變量存儲在主內存&#xff08;main …

TLS協議

目錄 什么是TLS協議&#xff1f; TLS的基本流程&#xff1f; 兩種密鑰交換算法&#xff1f; 基于ECDHE密鑰交換算法的TLS握手過程&#xff1f; 基于RSA密鑰交換算法的TLS握手過程&#xff1f; 基于RSA的握手和基于ECDHE的握手有什么區別&#xff1f; 什么是前向保密&…

tp6 v3微信退款

/*** Notes:退款* param $out_trade_no 支付時候訂單號&#xff08;order表 original_bn&#xff09;兩個參數選一個這個要選對* param $out_refund_no 退款訂單號* param $total 訂單金額* param $refund 退款金額* Time: 2023-08-10*/public function refundMoney($out_trade…

oracle的異常處理

oracle提供了預定義例外、非預定義例外和自定義例外三種類型。其中&#xff1a; l預定義例外用于處理常見的oracle錯誤&#xff1b; l非預定義例外用于處理預定義所不能處理的oracle錯誤&#xff1b; l自定義例外處理與oracle錯誤無關的其他情況。 Oracle代碼編寫過程中&am…

nginx反向代理與負載均衡

負載均衡依靠反向代理實現。nginx的代理分為七層代理與四層代理&#xff1a; 七層代理&#xff1a;七層代理的就是http請求和響應。七層代理是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模塊。而且配置方法名稱&#xff1a;upstream模塊&#xff0c;不能寫…

提升效率!Go語言開發者不可錯過的必備工具集合!

&#x1f337;&#x1f341; 博主貓頭虎 帶您 Go to Golang Language.??&#x1f341; &#x1f984; 博客首頁——貓頭虎的博客&#x1f390; &#x1f433;《面試題大全專欄》 文章圖文并茂&#x1f995;生動形象&#x1f996;簡單易學&#xff01;歡迎大家來踩踩~&#x1…

UDP數據報網絡編程(實現簡單的回顯服務器,客戶端)

回顯服務器表示客戶端發的是啥&#xff0c;服務器就返回啥&#xff0c;主要是為了熟悉UDP數據報網絡編程的基本步驟 對于程序的所有分析都寫到了代碼上 UDP回顯服務器代碼 package UdpEcho;import java.io.IOException; import java.net.DatagramPacket; import java.net.Dat…

ClickHouse查看執行計劃(EXPLAIN語法)

1.EXPLAIN 語法示例 EXPLAIN [AST | SYNTAX | QUERY TREE | PLAN | PIPELINE | ESTIMATE | TABLE OVERRIDE] [setting value, ...] [ SELECT ... | tableFunction(...) [COLUMNS (...)] [ORDER BY ...] [PARTITION BY ...] [PRIMARY KEY] [SAMPLE BY ...] [T…

途樂證券-最準確的KDJ改良指標?

KDJ目標是技術剖析的一種重要目標之一&#xff0c;它是利用隨機目標&#xff08;%R&#xff09;發展而來的&#xff0c;是一種反映商場超買和超賣狀況的買賣目標。KDJ目標由快線&#xff08;K線&#xff09;、慢線&#xff08;D線&#xff09;和隨機值&#xff08;J線&#xff…

RestTemplate HTTPS請求忽略SSL證書

問題描述 使用RestTemplate發送HTTPS請求的時候&#xff0c;出現了這樣的一個問題&#xff1a; sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification …

MySQL多表查詢

1.創建student和score表 創建score表 2.為student表和score表增加記錄 向student表插入記錄的INSERT語句如下&#xff1a; 向score表插入記錄的INSERT語句如下&#xff1a; 1.查詢student表的所有記錄 2.查詢student表的第2條到4條記錄 3.從student表查詢所有學生的學號&#…

2023最新影視泛目錄系統,蘋果cms最新下載地址

影視泛目錄系統是指一種集成了電影、電視劇、綜藝節目、動漫等多種影視資源資源的系統&#xff0c;其目的是為用戶提供一個方便快捷的影視資源檢索、瀏覽、分享、評論的平臺。該系統通過對影視資源進行分類、標簽化、評分等方式&#xff0c;為用戶提供更加精準的檢索和推薦服務…