php 实现聚类
PHP 实现聚类的方法
聚类分析是一种无监督学习技术,用于将数据点分组为具有相似特征的簇。PHP 可以通过调用外部库或手动实现算法来完成聚类任务。
使用 PHP-ML 库进行聚类
PHP-ML 是一个专门为 PHP 设计的机器学习库,支持多种聚类算法,如 K-Means 和 DBSCAN。
-
安装 PHP-ML
通过 Composer 安装 PHP-ML:composer require php-ai/php-ml -
K-Means 聚类示例
以下代码演示如何使用 K-Means 算法对二维数据进行聚类:use Phpml\Clustering\KMeans; $samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]]; $kmeans = new KMeans(2); // 分为 2 个簇 $clusters = $kmeans->cluster($samples); print_r($clusters); -
DBSCAN 聚类示例
DBSCAN 是一种基于密度的聚类算法,适合处理非球形分布的数据:use Phpml\Clustering\DBSCAN; $samples = [[1, 1], [1, 2], [8, 7], [8, 8], [25, 25]]; $dbscan = new DBSCAN($epsilon = 2, $minSamples = 2); $clusters = $dbscan->cluster($samples); print_r($clusters);
手动实现 K-Means 算法
如果不依赖外部库,可以手动实现 K-Means 算法:
-
初始化质心
随机选择 K 个点作为初始质心:function initCentroids(array $data, int $k): array { $centroids = []; $keys = array_rand($data, $k); foreach ($keys as $key) { $centroids[] = $data[$key]; } return $centroids; } -
分配点到最近的质心
计算每个点到质心的距离,分配到最近的簇:function assignClusters(array $data, array $centroids): array { $clusters = array_fill(0, count($centroids), []); foreach ($data as $point) { $minDist = INF; $clusterIndex = 0; foreach ($centroids as $i => $centroid) { $dist = sqrt(pow($point[0] - $centroid[0], 2) + pow($point[1] - $centroid[1], 2)); if ($dist < $minDist) { $minDist = $dist; $clusterIndex = $i; } } $clusters[$clusterIndex][] = $point; } return $clusters; } -
更新质心位置
计算每个簇的均值作为新质心:function updateCentroids(array $clusters): array { $centroids = []; foreach ($clusters as $cluster) { $sumX = 0; $sumY = 0; foreach ($cluster as $point) { $sumX += $point[0]; $sumY += $point[1]; } $centroids[] = [ $sumX / count($cluster), $sumY / count($cluster) ]; } return $centroids; } -
迭代直到收敛
重复分配和更新步骤,直到质心不再变化:function kMeans(array $data, int $k, int $maxIterations = 100): array { $centroids = initCentroids($data, $k); for ($i = 0; $i < $maxIterations; $i++) { $clusters = assignClusters($data, $centroids); $newCentroids = updateCentroids($clusters); if ($centroids === $newCentroids) break; $centroids = $newCentroids; } return $clusters; }
注意事项
-
数据预处理
聚类对数据范围敏感,建议标准化或归一化数据(如使用array_map或 Z-score 标准化)。 -
选择 K 值
对于 K-Means,可以通过肘部法则(Elbow Method)或轮廓系数(Silhouette Score)确定最佳 K 值。 -
性能优化
大数据集可能需分块处理或使用更高效的算法(如 Mini-Batch K-Means)。
通过以上方法,可以在 PHP 中实现高效的聚类分析,适用于用户分群、异常检测等场景。






