K 平均值聚类(K-means clustering)是一种广泛使用的无监督学习算法,用于将数据点划分为K个不同的簇(cluster),其中K是用户指定的参数,表示希望数据被分成多少个簇。算法的目标是将数据点分配到簇中,以便簇内的数据点之间的相似度高,而不同簇之间的数据点的相似度低。
K 平均值聚类算法的基本步骤如下:
让我们通过一个简单的例子来解释 K 平均值聚类分析的计算逻辑。假设我们有以下 2D 空间中的 6 个数据点,我们想将它们聚类成 K=2 个簇。
数据点如下:
下面是 K 平均值聚类分析的步骤:
最终,我们有两个簇:
K-平均值聚类的关键挑战之一是选择合适的K值(即簇的数量)。通常需要使用如肘部法则(Elbow Method)、轮廓分析(Silhouette Method)等技术来确定最佳的K值。此外,由于K-平均值聚类对初始簇中心的选择敏感,可能需要多次运行算法以获得稳定的聚类结果。


该 iris.data 文件包含五列,分别代表以下内容 :
C#public class IrisData
{
[LoadColumn(0)]
public float SepalLength;
[LoadColumn(1)]
public float SepalWidth;
[LoadColumn(2)]
public float PetalLength;
[LoadColumn(3)]
public float PetalWidth;
}
[LoadColumn(n)] 是一个属性(Attribute),它在这里用来指示机器学习数据加载过程中,每个字段应当从数据文件中的哪一列加载。这通常用在基于.NET的机器学习库,如ML.NET中,用于数据预处理和加载的过程。n 是列索引,从0开始计数,对应于数据文件中的列。
例如,[LoadColumn(0)] 表明 SepalLength 应当从数据集的第一列加载,[LoadColumn(1)] 表明 SepalWidth 应当从第二列加载,以此类推。
C#public class ClusterPrediction
{
[ColumnName("PredictedLabel")]
public uint PredictedClusterId;
[ColumnName("Score")]
public float[]? Distances;
}
ClusterPrediction 是用来表示聚类模型的预测结果的数据结构。这个类定义了两个属性:
PredictedClusterId: 表示预测的聚类ID,用于标识数据点被分配到的聚类。它被定义为 public uint(无符号整型),这意味着它是公开可访问的,并且只能存储非负整数值。[ColumnName("PredictedLabel")] 属性指定了当预测结果被输出时,这个字段应当对应的列名是 "PredictedLabel"。Distances: 表示数据点到各个聚类中心的距离数组。这是一个可空(nullable)的浮点数数组,意味着它可以包含零个或多个浮点数,或者是 null。[ColumnName("Score")] 属性指定了当预测结果被输出时,这个字段应当对应的列名是 "Score"。C#static readonly string _dataPath = "./data/iris.data";
static readonly string _modelPath = "./data/IrisClusteringModel.zip";
C#// 创建一个新的 MLContext 实例,用于随机化和其他设置。这是开始使用 ML.NET 时的入口点。
var mlContext = new MLContext(seed: 0);
C#// 从文本文件加载数据。这里的 'IrisData' 是一个将定义数据结构的类。
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
C#// 创建一个数据处理管道。首先,它将四个特征列合并到一个特征向量中,然后应用 KMeans 聚类算法。
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));
C#// 训练模型。这将运行数据通过管道,并输出一个训练好的模型。
var model = pipeline.Fit(dataView);
C#// 保存模型到文件。这样,您就可以在其他地方加载和使用它。
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
mlContext.Model.Save(model, dataView.Schema, fileStream);
}
C#// 创建一个预测引擎。这可以用来对新的、未见过的数据进行预测。
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);
TestIrisData 类测试数据实例C#internal static readonly IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
C#// 使用预测引擎对一个示例数据进行预测。这里 'Setosa' 是一个包含花卉测量数据的实例。
var prediction = predictor.Predict(Setosa);
Console.WriteLine($"簇: {prediction.PredictedClusterId}");
Console.WriteLine($"距离: {string.Join(" ", prediction.Distances)}");

本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!