Kmeans算法(Jfreechart展示+Spring注入)

转载请注明:http://blog.youkuaiyun.com/HEL_WOR/article/details/50583923

一直想找个方法把分类的数据直观的展示出来,最近在Java上发现了类似Pyhton的MatPlotLib库的jar包,上周末在屋里把代码折腾出来了。

Kmeans算属于非监督的聚类算法。
监督学习的定义是通过对算法进行有正面影响和负面影响的训练,算法能够学习出一种模型,这个时候我们将测试数据输入这个模型后,模型能得出我们想要的结果,例如分类。举个例子,我们怎样训练自己家的狗狗要听话,我们通过狗狗做对的事情奖励它,做错了事情教育它,那么足够多的时间后我们就会觉得狗狗越来越听话了。这就属于监督学习。

非监督学习是我们无法确切的去训练算法认识到什么是positive的,什么是negative的,具体的学习过程只能由算法自己去描述。

Kmeans属于非监督学习,与SVM,Logistic,决策树等监督学习算法不同,我们不能如果训练SVM那样给出一系列的正反数据点去训练算法成为一种能分辨正负类点的模型。Kmeans需要自己去学习如果分类。所以分类的本身就只能来源于算法的自身描述。

Kmeans算法能实现分类核心是因为其距离函数:
这里写图片描述

这个算法是一个坐标上升的优化算法,有兴趣的话可以自己推导,公式会不停交替地对u和c做求导操作,当导数趋于0时结果趋于不变,最终算法收敛。
根据这个距离公式,我们可以根据距离来描述类别。设定k个中心点,根据所有数据点与k个中心点的距离,把与中心点距离最近的点划分为一类。这是对公式中u的优化,同时对每一个类型重新计算中心点,这是对公式中c的优化,到最后,算法收敛,分类完成。

由此,对算法的描述为:
这里写图片描述

算法在实现后,要注意:
1.类别的个数会对分类结果有很大影响。
2.初始中心点的选择不当会造成数据点分类错误。
关于初始中心点,在SVM看到过有自启发式的方式。不知道能不能用到Kmeans上。

测试数据集: testData
测试结果(JFreeChart实现图像展示):
这里写图片描述

Kmeans类(算法主逻辑):

package helWor.Share.KMeans;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class KMeans {
    private static int ClusterNum;
    private static ArrayList<ArrayList<double[]>> cluster;
    private static double[][] center = new double[ClusterNum][2];
    private static double[][] lastCenter = new double[ClusterNum][2];
    private ArrayList<double[]> dataSet = new ArrayList<double[]>();

    /*
     * 构造函数
     */
    public KMeans(int clusterNum)
    {
        ClusterNum = clusterNum;
    }

    /*
     * 主执行方法
     */
    public void ExecuteMethod() throws IOException
    {
        LoadDataSet();
        initCenters();
        do
        {
            initCluster();
            AllocateCluster();
            lastCenter = center;
            setNewCenter();
        }
        while(this.IsCenterChanged(center));
    }

    /*
     * 获取簇
     */
    public ArrayList<ArrayList<double[]>> getCluster()
    {
        return cluster;
    }

    /*
     * 装载数据
     */
### KMeansKMeans++ 算法 MATLAB 实现 #### KMeans 算法实现 MATLAB 中可以直接调用内置的 `kmeans` 函数来进行标准 k-means 聚类操作[^2]。 ```matlab % 数据集 X 是 n×d 的矩阵,n 表示样本数量,d 表示特征维度 X = rand(100, 2); % 假设我们有 100 个二维随机数据点作为例子 numClusters = 3; % 设定簇的数量为 3 [idx, C] = kmeans(X, numClusters); figure; gscatter(X(:,1), X(:,2), idx); hold on; plot(C(:,1), C(:,2), 'kx', 'MarkerSize', 15, 'LineWidth', 3); legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Centroids'); title('K-Means Clustering Results with Built-in Function'); ``` 此段代码展示了如何利用 MATLAB 自带工具箱执行基本的 k-means 聚类分析,并绘制出聚类后的可视化图形。 #### KMeans++ 初始化方法及其完整流程 对于更优化版本即 k-means++ 来说,在初始化阶段会采取特殊策略选取初始质心位置以改善最终效果[^3]。以下是完整的自定义实现方式: ```matlab function centroids = initCentroidsPlusPlus(dataSet, k) m = size(dataSet, 1); firstCenterIdx = randi(m); centroids = dataSet(firstCenterIdx, :); D = zeros(m, 1); P = zeros(m, 1); for i=2:k, distances = pdist2(dataSet, centroids, 'euclidean').^2; minDistances = min(distances,[],2); sumD = sum(minDistances); P(:) = minDistances / sumD; [~, nextCenterIdx] = max(categorical(P)); newCenter = dataSet(nextCenterIdx,:); centroids = [centroids ; newCenter]; end end function [idx, centroids] = my_kmeans_plusplus(X,k,max_iter) N=size(X,1); d=size(X,2); idx=zeros(N,1); old_centroids=rand(k,d)*range(X)+min(X); centroids=initCentroidsPlusPlus(X,k); iter=0; while true dists=pdist2(X,centroids,'euclidean'); [~,idx]=min(dists,[],2); updated=false; for j=1:k cluster_points=X(idx==j,:); if ~isempty(cluster_points) mean_point=mean(cluster_points); if norm(mean_point-centroids(j,:))>eps centroids(j,:)=mean_point; updated=true; end end end if ~updated || iter>=max_iter break; else iter=iter+1; end end end ``` 上述两部分代码共同构成了基于 k-means++ 初始条件下的整个聚类过程。其中第一个函数负责按照概率比例挑选初始中心点;第二个则是实现了完整的迭代更新逻辑直至收敛或达到最大循环次数为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值