K-means算法 聚类数量为不确定,是动态性的,根据用户输入最小和最大阈值进行确定,如何用C#进行,请给出相应代码
时间: 2024-03-26 17:36:03 浏览: 24
以下是一个基本的K-means聚类算法的C#实现,其中聚类数量通过输入的最小和最大阈值进行动态确定:
```csharp
using System;
using System.Collections.Generic;
class KMeans
{
private int k;
private int iterations;
private List<double[]> data;
private List<double[]> centroids;
private List<int>[] clusters;
public KMeans(int k, int iterations)
{
this.k = k;
this.iterations = iterations;
}
public void Train(List<double[]> data, double minThreshold, double maxThreshold)
{
this.data = data;
// Initialize centroids randomly
centroids = new List<double[]>();
Random random = new Random();
for (int i = 0; i < k; i++)
{
double[] centroid = new double[data[0].Length];
for (int j = 0; j < data[0].Length; j++)
{
centroid[j] = random.NextDouble() * (maxThreshold - minThreshold) + minThreshold;
}
centroids.Add(centroid);
}
// Start iterations
for (int i = 0; i < iterations; i++)
{
// Assign each data point to the closest centroid
clusters = new List<int>[k];
for (int j = 0; j < k; j++)
{
clusters[j] = new List<int>();
}
for (int j = 0; j < data.Count; j++)
{
int closestIndex = 0;
double closestDistance = double.MaxValue;
for (int l = 0; l < k; l++)
{
double distance = EuclideanDistance(data[j], centroids[l]);
if (distance < closestDistance)
{
closestIndex = l;
closestDistance = distance;
}
}
clusters[closestIndex].Add(j);
}
// Recalculate centroids
for (int j = 0; j < k; j++)
{
double[] newCentroid = new double[data[0].Length];
for (int l = 0; l < clusters[j].Count; l++)
{
for (int m = 0; m < data[0].Length; m++)
{
newCentroid[m] += data[clusters[j][l]][m] / clusters[j].Count;
}
}
centroids[j] = newCentroid;
}
}
}
public int[] Predict(List<double[]> testData)
{
int[] predictions = new int[testData.Count];
for (int i = 0; i < testData.Count; i++)
{
int closestIndex = 0;
double closestDistance = double.MaxValue;
for (int j = 0; j < k; j++)
{
double distance = EuclideanDistance(testData[i], centroids[j]);
if (distance < closestDistance)
{
closestIndex = j;
closestDistance = distance;
}
}
predictions[i] = closestIndex;
}
return predictions;
}
private double EuclideanDistance(double[] a, double[] b)
{
double distance = 0;
for (int i = 0; i < a.Length; i++)
{
distance += Math.Pow(a[i] - b[i], 2);
}
return Math.Sqrt(distance);
}
}
```
使用方法如下:
```csharp
List<double[]> data = new List<double[]>();
// Populate data list with input data
KMeans kMeans = new KMeans(minClusters, maxClusters);
kMeans.Train(data, minThreshold, maxThreshold);
List<double[]> testData = new List<double[]>();
// Populate testData list with test data
int[] predictions = kMeans.Predict(testData);
```