让我们一起ML吧(一)聚类分析
让我们一起ML(Make Love Machine Learning)吧!
ML.NET是微软推出的一个免费的开源跨平台机器学习框架,可用于生成自定义机器学习解决方案并将其集成到 .NET 应用程序。ML.NET当前最新版本为0.7,目前处于预览状态,本文中用到的例子来自于微软的官方教程,但随时可能更改,请注意版本变更造成的例子无法运行的状况。
准备工作
你需要一个安装了.NET Core 的VS2017 15.6或更高版本。
了解问题
在本篇中我们将对鸢尾花的数据进行聚类分析,并通过训练出来的模型来判断给出的数据是哪种鸢尾花。
此问题的本质即基于花卉特征将鸢尾花数据归入不同的组。 这些特征包括:花萼的长度和宽度以及花瓣的长度和宽度。 此教程假设每朵花的类型都是未知的。 需通过这些特征了解数据集的结构,并预测数据实例与此结构的拟合程度。
浅解算法
本例中选择K-Means算法解决问题,K-Means算法是个什么算法?不懂也没关系,简单给你介绍一下(我也是刚查的,想详细了解的自己wiki百科),K-Means算法简单来说就是给出n个数据,然后指定一个K(这个K是个大于1小于n的正整数),n个数据就被分成K堆,这个堆被称为聚类,再给出一个样例数据,用同样的方法将样例分入其中某一聚类完成聚类分析。
这K堆或者K类或者K组(K个聚类)如何分呢?假设n个数据为二维平面中的点 P1(x1,y1),P2(x2,y2),...,Pn(xn,yn) ,从n个点中随机选出K个点,这K个点被称作形心(有人也翻译成质心),然后计算其他n-K个点与这K个形心的欧氏距离(即两点之间的直线距离,欧氏即欧几里得),一个点距离哪个形心的距离最短即被分到哪个组,然后循环更换形心再次计算,直到K个组中的点都不再变化,至此n个点即被分为K组数据(K个聚类)。K-Means算法的优点是简单易行,只用指定一个参数K,难点是K值的选取。如果对算法有兴趣可以移步这里看看如何实现算法。
示例代码
本示例所有官方教程源代码都在这里,我的示例与官方示例略有不同。
- 打开VS创建一个控制台应用(.NET Core)命名为IrisClustering
- 安装Microsoft.ML Nuget包(当前最新版本为0.7)
- 在项目根路径下创建一个Data文件夹,从这里下载鸢尾花的数据保存到刚建好的Data文件夹下命名为iris_data.txt,点击iris_data.txt 将文件属性中复制到输出目录项的值改为如果较新则复制
在项目中添加实体类IrisData.cs如下:
1 using Microsoft.ML.Runtime.Api; 2 3 namespace IrisClustering 4 { 5 public class IrisData 6 { 7 [Column("0")] 8 public float SepalLength; 9 10 [Column("1")] 11 public float SepalWidth; 12 13 [Column("2")] 14 public float PetalLength; 15 16 [Column("3")] 17 public float PetalWidth; 18 } 19 20 public class ClusterPrediction 21 { 22 [ColumnName("PredictedLabel")] 23 public uint PredictedClusterId; 24 25 [ColumnName("Score")] 26 public float[] Distances; 27 } 28 }
其中IrisData
类是输入数据类,通过使用Column
属性在数据集文件中指定源列的索引。
ClusterPrediction
类表示应用到IrisData
实例的聚类分析模型的输出。通过使用ColumnName
属性将PredictedClusterId
和 Distances
字段分别绑定至PredicatedLabel
和 Score
列。
PredictedLabel
包含所预测群集的ID。Score
包含一个数组,这个数组中的数即为与群集形心之间欧氏距离的平方。这个数组的长度等于群集数(K-Means算法中的K值)。
接下来在Program.cs中添加预测模型的训练方法并通过Main方法训练预测模型并预测给出的样例属于哪种鸢尾花
1 using System; 2 using System.IO; 3 using System.Threading.Tasks; 4 using Microsoft.ML.Legacy; 5 using Microsoft.ML.Legacy.Data; 6 using Microsoft.ML.Legacy.Trainers; 7 using Microsoft.ML.Legacy.Transforms; 8 9 namespace IrisClustering 10 { 11 public static class Program 12 { 13 //数据文件路径 14 static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris_data.txt"); 15 //预测模型保存路径 16 static readonly string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip"); 17 //预测模型训练方法 18 private static PredictionModel<IrisData, ClusterPrediction> Train() 19 { 20 var pipeline = new LearningPipeline 21 { 22 new TextLoader(_dataPath).CreateFrom<IrisData>(separator: ','), //加载数据 23 new ColumnConcatenator( //指定数据列名 24 "Features", //特征 学习算法将通过ColumnConcatenator类将数据转化为特征列的值 25 "SepalLength", //花萼长度 26 "SepalWidth", //花萼宽度 27 "PetalLength", //花瓣长度 28 "PetalWidth"), //花瓣宽度 29 new KMeansPlusPlusClusterer() { K = 3 } //指定K-Means算法,这里因为数据中已经给出三个分类,所以我们指定K值为3 30 }; 31 var model = pipeline.Train<IrisData, ClusterPrediction>(); 32 return model; 33 } 34 35 //在Main方法前加async关键字是c#7.1及以后的新功能 36 //应当右键单击项目名称(IrisClustering) 属性->生成->高级->语言版本 中将语言改为c#7.1 37 private static async Task Main(string[] args) 38 { 39 PredictionModel<IrisData, ClusterPrediction> model = Train(); 40 await model.WriteAsync(_modelPath); 41 var prediction = model.Predict(TestIrisData.Setosa); 42 Console.WriteLine($"Cluster:{prediction.PredictedClusterId}"); 43 Console.WriteLine($"Distances:{string.Join(" ",prediction.Distances)}"); 44 Console.Read(); 45 } 46 } 47 }
被用于预测的样例数据如下TestIrisData.cs
1 namespace IrisClustering 2 { 3 static class TestIrisData 4 { 5 internal static readonly IrisData Setosa = new IrisData 6 { 7 SepalLength = 5.1f, 8 SepalWidth = 3.5f, 9 PetalLength = 1.4f, 10 PetalWidth = 0.2f 11 }; 12 } 13 }
程序运行结果如下:
PS:我多次运行后发现结果并不一定是同一个,如果你运行的结果与我不同也可能是正确的。另外PredictedClusterId并不是Distances数组的下标。
最后让我们看一下训练后得到的预测模型是什么东西吧
IrisClusteringModel.zip解压后得到DataLoaderModel和TrainingInfo两个文件夹,其中TrainingInfo中只有一个version.txt保存了一个版本号,而DataLoaderModel中存在数个名为model.key的二进制文件,这就是我们通过ML.NET训练出来的模型。
这样你就使用ML.NET完成了一次聚类分析。
******************************
欢迎随意打赏
转载于:https://www.cnblogs.com/sinkingcn/p/10035908.html
让我们一起ML吧(一)聚类分析相关推荐
- 基于Spark ML 聚类分析实战的KMeans
2019独角兽企业重金招聘Python工程师标准>>> 聚类分析是一个无监督学习 (Unsupervised Learning) 过程, 一般是用来对数据对象按照其特征属性进行分组, ...
- ML之KMeans:利用KMeans算法对Boston房价数据集(两特征+归一化)进行二聚类分析
ML之KMeans:利用KMeans算法对Boston房价数据集(两特征+归一化)进行二聚类分析 目录 利用KMeans算法对Boston房价数据集(两特征+归一化)进行二聚类分析 设计思路 输出结果 ...
- ML之kmeans:通过数据预处理(分布图箱线图热图/文本转数字/构造特征/编码/PCA)利用kmeans实现汽车产品聚类分析(SSE-平均轮廓系数图/聚类三维图/雷达图/饼图柱形图)/竞品分析之详细
ML之kmeans:通过数据预处理(分布图箱线图热图/文本转数字/构造特征/编码/PCA)利用kmeans实现汽车产品聚类分析(SSE-平均轮廓系数图/聚类三维图/雷达图/饼图柱形图)/竞品分析之详细 ...
- 【ML】使用未标记数据 - 聚类分析
- ML之Clustering之K-means:K-means算法简介、应用、经典案例之详细攻略
ML之Clustering之K-means:K-means算法简介.应用.经典案例之详细攻略 目录 K-means算法简介 1.K-means算法适用的数据类型 2.K-Means算法的全局最优解和 ...
- 使用C# 探索 ML.NET 中的不同机器学习任务
什么是 ML.NET? ML.NET 是 Microsoft 开源的针对 .NET 应用程序的 跨平台机器学习库,允许您使用 C#.F# 或任何其他 .NET 语言执行机器学习任务.此外,ML.NET ...
- ML.NET机器学习、API容器化与Azure DevOps实践(一):简介
打算使用几篇文章介绍一下.NET下的机器学习框架ML.NET的具体应用,包括一些常用的业务场景.算法的选择.模型的训练以及RESTful API的创建.机器学习服务容器化,以及基于Azure DevO ...
- 使用Kmeans聚类分析对复杂的数据进行分类
代码解释 使用简单的Kmeans方法对特征数与样本数较多的电离层雷达回波数据进行分类,并计算分类精度,检验效果. 其中,通过PCA方法对数据降维实现可视化. 本文代码通过MATLAB2020a编写. ...
- R语言多元统计包简介:各种假设检验 统计方法 聚类分析 数据处理
转载自:http://blog.csdn.net/duqi_yc/article/details/9446707 www.biostatistic.net/统计分析 生物信息 sas matlab R ...
- 机器学习实践:足球比赛聚类分析--11
机器学习实践:足球比赛聚类分析 1.实验描述 本实验利用K-Means聚类分析算法对足球比赛结果进行分析,该算法通过Sprak Mllib库来调用,我们将学习K-Means算法的K值选取,聚类原理等内 ...
最新文章
- golang bufio.newscanner如何超时跳出_Golang微服务的熔断与限流
- linux开机启动脚本的顺序
- [trustzone]-ARM Trustzone架构下的软件框图
- [快速入门MATLAB]MATLAB常见问题及解答汇总
- 不会诈骗的公司 都倒闭了
- IIS 6.0 SSL证书安装
- C++中main函数的返回类型必须是int
- span的title标签中的换行
- 转:windows xp 安装MYSQL 出现Error 1045 access denied 的解决方法
- ## 2018-2019-1 《信息安全系统设计基础》 20165232 20165231 20165235 实验五 通信协议设计...
- spyder安装matplotlib
- Oracle 文字排序,按照拼音,姓氏笔画等
- Mac Mounty正常卸载方法(mount failed异常解决)
- 计算机组成原理 第四版 总线的主模块 总线的从模块,总线的基本概念
- 产品通过WHQL认证后的好处
- 北航计算机学院吴俊杰,吴俊杰老师在经管学院建院六十周年大会上的发言
- python转盘抽奖_Python使用Tkinter实现转盘抽奖器的步骤详解
- SDNU-多校训练赛2-[ABF]
- 删除电脑属性制造商_win7系统怎么修改系统制造商信息?
- DuiLib的第一个win32程序