Program.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using HTEXScreen.Service;
  2. using Microsoft.ML;
  3. using Microsoft.ML.Data;
  4. using Microsoft.ML.Trainers;
  5. using System;
  6. using static System.Runtime.InteropServices.JavaScript.JSType;
  7. namespace AML.APP
  8. {
  9. internal class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. // 时区偏移字符串
  14. // 时区偏移字符串
  15. string timeZoneOffsetString = "-08:59";
  16. bool plus = true;
  17. if (timeZoneOffsetString.Contains("-"))
  18. {
  19. plus=false;
  20. }
  21. int timeZoneOffsetHours = 8;
  22. // 去除时区偏移字符串中的正负号
  23. timeZoneOffsetString = timeZoneOffsetString.Replace("+", "").Replace("-", "");
  24. // 尝试解析格式化后的时区偏移字符串
  25. if (TimeSpan.TryParse(timeZoneOffsetString, out TimeSpan timeZoneOffset))
  26. {
  27. // 将时区偏移转换为小时数
  28. timeZoneOffsetHours = plus ? (int)timeZoneOffset.TotalHours : -(int)timeZoneOffset.TotalHours;
  29. }
  30. List<DataPoint> data = new List<DataPoint>();
  31. // 创建一个新的 ML.NET 环境
  32. //Random random = new Random();
  33. //
  34. //for (int i = 0; i < 500; i++)
  35. //{
  36. // data.Add(new DataPoint { Feature = random.Next(1, 1001) });
  37. //}
  38. float[] ds= new float[] { 2,1,5,8,7,6,30,35,5,23,78,28,28,30,31,29,21,25,99,101,98,900};
  39. var datasc= MLService.GetNormalCluster(ds, 5, 0.3);
  40. foreach (var d in ds) {
  41. data.Add(new DataPoint { Feature = d });
  42. }
  43. // 定义数据视图
  44. var mlContext = new MLContext();
  45. var dataView = mlContext.Data.LoadFromEnumerable(data);
  46. // 定义聚类管道
  47. var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Feature" })
  48. .Append(mlContext.Clustering.Trainers.KMeans(numberOfClusters:3)); // 假设我们想要将数据分成3个集群
  49. // 训练模型
  50. var model = pipeline.Fit(dataView);
  51. // 转换数据以获取聚类结果
  52. var predictions = model.Transform(dataView);
  53. // 提取聚类结果
  54. var inMemoryCollection = mlContext.Data.CreateEnumerable<ClusterPrediction>(predictions, reuseRowObject: false);
  55. // 打印聚类结果
  56. //var clusterSizes = new int[3]; // 假设有3个聚类
  57. int index =0;
  58. List<ClusterData> clusterDatas = new List<ClusterData>();
  59. foreach (var prediction in inMemoryCollection)
  60. {
  61. //Console.WriteLine($"Data point: {data[index].Feature}, Cluster: {prediction.ClusterId}");
  62. //clusterSizes[prediction.ClusterId-1]++;
  63. var clusterData= clusterDatas.Find(x => x.ClusterId.Equals(prediction.ClusterId));
  64. if (clusterData!=null)
  65. {
  66. clusterData.count +=1;
  67. clusterData.datas.Add(data[index].Feature);
  68. }
  69. else {
  70. var datas = new List<float> { data[index].Feature };
  71. clusterDatas.Add(new ClusterData { count=1, ClusterId=prediction.ClusterId, datas=datas });
  72. }
  73. index++;
  74. }
  75. // 预测聚类
  76. // 确定最密集的部分
  77. // 这通常需要对聚类结果进行分析,比如计算每个聚类的平均距离、大小等
  78. // 在这里,你可以通过比较不同聚类的数据点数量或计算聚类中心周围的密度来估计哪个是最密集的
  79. // 示例:计算每个聚类的数据点数量
  80. // 找出最大的聚类
  81. //var maxClusterIndex = clusterSizes.ToList().IndexOf(clusterSizes.Max());
  82. //Console.WriteLine($"The densest cluster is cluster {maxClusterIndex} with {clusterSizes[maxClusterIndex]} data points.");
  83. // 你还可以进一步分析聚类的特性,比如找出聚类中心、计算聚类内的方差等
  84. var cluster= clusterDatas.OrderByDescending(x =>x.count).FirstOrDefault();
  85. }
  86. }
  87. // 定义数据模型
  88. public class DataPoint
  89. {
  90. public float Feature { get; set; }
  91. }
  92. // 聚类预测类
  93. public class ClusterPrediction
  94. {
  95. [ColumnName("PredictedLabel")]
  96. public uint ClusterId;
  97. // 你可以添加其他预测列,比如距离聚类中心的距离等
  98. }
  99. public class ClusterData {
  100. public List<float> datas { get; set; } = new List<float>();
  101. public uint ClusterId { get; set; }
  102. public int count { get; set; }
  103. public float avg { get; set; }
  104. }
  105. }