using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HTEX.Lib.ETL { public class KMeansService { public static Dictionary> KMeans(IEnumerable datas) { // 初始化质心,可以选择数据中的k个随机点作为初始质心 List centroids = new List(); centroids.Add(datas.Min()); centroids.Add(datas.Max()); centroids.Sort(); // 对质心进行排序以避免重复 Dictionary> clustersResults = new Dictionary>(); // 迭代次数 int maxIterations = 100; for (int iteration = 0; iteration < maxIterations; iteration++) { // 将数据点分配给最近的质心 Dictionary> clusters = new Dictionary>(); foreach (int point in datas) { double nearestCentroid = centroids.OrderBy(c => Math.Abs(point - c)).First(); if (!clusters.ContainsKey(nearestCentroid)) { clusters[nearestCentroid] = new List(); } clusters[nearestCentroid].Add(point); } // 更新质心位置 List newCentroids = new List(); foreach (KeyValuePair> cluster in clusters) { double sum = cluster.Value.Sum(); int count = cluster.Value.Count; double newCentroid = sum *1.0/ count; // 计算均值 newCentroids.Add(newCentroid); // 输出当前聚类的信息 //Console.WriteLine($"Cluster with centroid {cluster.Key}:"); //Console.WriteLine($"Min: {cluster.Value.Min()}, Max: {cluster.Value.Max()}, Average: {sum / count}"); } // 检查质心是否改变 newCentroids.Sort(); clustersResults=clusters; if (newCentroids.SequenceEqual(centroids)) { break; } centroids = newCentroids; } return clustersResults; } public static Dictionary> KMeans(IEnumerable datas) { // 初始化质心,可以选择数据中的k个随机点作为初始质心 List centroids = new List(); centroids.Add(datas.Min()); centroids.Add(datas.Max()); centroids.Sort(); // 对质心进行排序以避免重复 Dictionary> clustersResults = new Dictionary>(); // 迭代次数 int maxIterations = 100; for (int iteration = 0; iteration < maxIterations; iteration++) { // 将数据点分配给最近的质心 Dictionary> clusters = new Dictionary>(); foreach (int point in datas) { double nearestCentroid = centroids.OrderBy(c => Math.Abs(point - c)).First(); if (!clusters.ContainsKey(nearestCentroid)) { clusters[nearestCentroid] = new List(); } clusters[nearestCentroid].Add(point); } // 更新质心位置 List newCentroids = new List(); foreach (KeyValuePair> cluster in clusters) { int sum = cluster.Value.Sum(); int count = cluster.Value.Count; double newCentroid = sum *1.0/ count; // 计算均值 newCentroids.Add(newCentroid); // 输出当前聚类的信息 //Console.WriteLine($"Cluster with centroid {cluster.Key}:"); //Console.WriteLine($"Min: {cluster.Value.Min()}, Max: {cluster.Value.Max()}, Average: {sum / count}"); } // 检查质心是否改变 newCentroids.Sort(); clustersResults=clusters; if (newCentroids.SequenceEqual(centroids)) { break; } centroids = newCentroids; } return clustersResults; } } }