您现在的位置是:网站首页 > 如何在JavaScript中实现K-means聚类算法文章详情

如何在JavaScript中实现K-means聚类算法

陈川 JavaScript 15487人已围观

K-means算法是一种广泛应用于数据挖掘和机器学习领域的无监督学习方法。它主要用于将数据集划分为K个簇,使得同一簇内的数据点之间的相似度尽可能高,而不同簇的数据点之间的相似度尽可能低。本文将详细讲解如何在JavaScript中实现K-means聚类算法,并提供一个简单的前端应用实例。

K-means算法原理

算法步骤:

  1. 初始化:随机选择K个数据点作为初始质心。
  2. 分配阶段(或称"分组阶段"):计算每个数据点到所有质心的距离,将数据点分配给距离最近的质心所在的簇。
  3. 更新阶段:对于每个簇,计算簇内所有数据点的平均值,将其作为新的质心。
  4. 重复:重复执行第二步和第三步,直到质心的位置不再发生变化或者达到预设的最大迭代次数。

计算距离的方法

通常使用欧氏距离来衡量数据点之间的距离:

[ d = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2} ]

其中( x_i )和( y_i )是两个数据点在第i维上的值。

JavaScript 实现 K-means 算法

以下是一个简单的JavaScript实现:

function euclideanDistance(pointA, pointB) {
    let sumOfSquares = 0;
    for (let i = 0; i < pointA.length; i++) {
        sumOfSquares += Math.pow(pointA[i] - pointB[i], 2);
    }
    return Math.sqrt(sumOfSquares);
}

function kMeans(data, k, maxIterations = 100) {
    // 随机选择k个数据点作为初始质心
    const centroids = data.slice(0, k);

    for (let iteration = 0; iteration < maxIterations; iteration++) {
        // 分配阶段
        const clusters = new Array(k).fill(null).map(() => []);
        data.forEach(point => {
            let minDistance = Infinity;
            let closestCentroidIndex = -1;
            centroids.forEach((centroid, index) => {
                const distance = euclideanDistance(point, centroid);
                if (distance < minDistance) {
                    minDistance = distance;
                    closestCentroidIndex = index;
                }
            });
            clusters[closestCentroidIndex].push(point);
        });

        // 更新阶段
        centroids = clusters.map(cluster => cluster.reduce((acc, cur) => {
            let sum = acc.slice();
            for (let i = 0; i < acc.length; i++) {
                sum[i] += cur[i];
            }
            return sum;
        }, []).map(clusterSum => clusterSum / cluster.length));

        // 检查是否收敛
        if (centroids.every((centroid, i) => euclideanDistance(centroid, centroids[i]) === 0)) {
            break;
        }
    }

    return { centroids, clusters };
}

// 示例数据
const data = [
    [1, 2],
    [1.5, 1.8],
    [5, 8],
    [8, 8],
    [1, 0.6],
    [9, 11]
];

const result = kMeans(data, 2);
console.log("Centroids:", result.centroids);
console.log("Clusters:", result.clusters);

前端应用示例

在HTML中创建一个简单的界面来展示K-means算法的结果:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>K-means Clustering Visualization</title>
<style>
    .cluster {
        display: inline-block;
        margin: 10px;
        border: 1px solid black;
    }
</style>
</head>
<body>
<div id="visualization"></div>
<script>
    function visualizeClusters(data, clusters) {
        const visualizationDiv = document.getElementById('visualization');
        clusters.forEach((points, index) => {
            const clusterDiv = document.createElement('div');
            clusterDiv.className = 'cluster';
            points.forEach(point => {
                const circle = document.createElement('div');
                circle.style.width = `${point[0]}px`;
                circle.style.height = `${point[1]}px`;
                circle.style.position = 'absolute';
                clusterDiv.appendChild(circle);
            });
            visualizationDiv.appendChild(clusterDiv);
        });
    }

    const data = [
        [1, 2],
        [1.5, 1.8],
        [5, 8],
        [8, 8],
        [1, 0.6],
        [9, 11]
    ];

    const result = kMeans(data, 2);
    visualizeClusters(data, result.clusters);
</script>
</body>
</html>

这段代码首先定义了一个用于显示结果的HTML区域,然后通过JavaScript调用visualizeClusters函数来渲染数据点和它们所属的簇。kMeans函数与之前提供的相同,这里直接调用并展示了其结果。

结论

通过上述示例,我们不仅了解了K-means算法的基本原理,还学习了如何在JavaScript中实现这一算法,并将其应用到前端页面上进行可视化展示。这对于数据探索、用户行为分析等领域具有重要意义,能够帮助开发者更直观地理解数据分布和模式。

我的名片

网名:川

职业:前端开发工程师

现居:四川省-成都市

邮箱:chuan@chenchuan.com

站点信息

  • 建站时间:2017-10-06
  • 网站程序:Koa+Vue
  • 本站运行
  • 文章数量
  • 总访问量
  • 微信公众号:扫描二维码,关注我
微信公众号
每次关注
都是向财富自由迈进的一步