让我们一起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属性将PredictedClusterIdDistances 字段分别绑定至PredicatedLabelScore 列。

  • 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吧(一)聚类分析相关推荐

  1. 基于Spark ML 聚类分析实战的KMeans

    2019独角兽企业重金招聘Python工程师标准>>> 聚类分析是一个无监督学习 (Unsupervised Learning) 过程, 一般是用来对数据对象按照其特征属性进行分组, ...

  2. ML之KMeans:利用KMeans算法对Boston房价数据集(两特征+归一化)进行二聚类分析

    ML之KMeans:利用KMeans算法对Boston房价数据集(两特征+归一化)进行二聚类分析 目录 利用KMeans算法对Boston房价数据集(两特征+归一化)进行二聚类分析 设计思路 输出结果 ...

  3. ML之kmeans:通过数据预处理(分布图箱线图热图/文本转数字/构造特征/编码/PCA)利用kmeans实现汽车产品聚类分析(SSE-平均轮廓系数图/聚类三维图/雷达图/饼图柱形图)/竞品分析之详细

    ML之kmeans:通过数据预处理(分布图箱线图热图/文本转数字/构造特征/编码/PCA)利用kmeans实现汽车产品聚类分析(SSE-平均轮廓系数图/聚类三维图/雷达图/饼图柱形图)/竞品分析之详细 ...

  4. 【ML】使用未标记数据 - 聚类分析

  5. ML之Clustering之K-means:K-means算法简介、应用、经典案例之详细攻略

    ML之Clustering之K-means:K-means算法简介.应用.经典案例之详细攻略 目录 K-means算法简介 1.K-means算法适用的数据类型​ 2.K-Means算法的全局最优解和 ...

  6. 使用C# 探索 ML.NET 中的不同机器学习任务

    什么是 ML.NET? ML.NET 是 Microsoft 开源的针对 .NET 应用程序的 跨平台机器学习库,允许您使用 C#.F# 或任何其他 .NET 语言执行机器学习任务.此外,ML.NET ...

  7. ML.NET机器学习、API容器化与Azure DevOps实践(一):简介

    打算使用几篇文章介绍一下.NET下的机器学习框架ML.NET的具体应用,包括一些常用的业务场景.算法的选择.模型的训练以及RESTful API的创建.机器学习服务容器化,以及基于Azure DevO ...

  8. 使用Kmeans聚类分析对复杂的数据进行分类

    代码解释 使用简单的Kmeans方法对特征数与样本数较多的电离层雷达回波数据进行分类,并计算分类精度,检验效果. 其中,通过PCA方法对数据降维实现可视化. 本文代码通过MATLAB2020a编写. ...

  9. R语言多元统计包简介:各种假设检验 统计方法 聚类分析 数据处理

    转载自:http://blog.csdn.net/duqi_yc/article/details/9446707 www.biostatistic.net/统计分析 生物信息 sas matlab R ...

  10. 机器学习实践:足球比赛聚类分析--11

    机器学习实践:足球比赛聚类分析 1.实验描述 本实验利用K-Means聚类分析算法对足球比赛结果进行分析,该算法通过Sprak Mllib库来调用,我们将学习K-Means算法的K值选取,聚类原理等内 ...

最新文章

  1. golang bufio.newscanner如何超时跳出_Golang微服务的熔断与限流
  2. linux开机启动脚本的顺序
  3. [trustzone]-ARM Trustzone架构下的软件框图
  4. [快速入门MATLAB]MATLAB常见问题及解答汇总
  5. 不会诈骗的公司 都倒闭了
  6. IIS 6.0 SSL证书安装
  7. C++中main函数的返回类型必须是int
  8. span的title标签中的换行
  9. 转:windows xp 安装MYSQL 出现Error 1045 access denied 的解决方法
  10. ## 2018-2019-1 《信息安全系统设计基础》 20165232 20165231 20165235 实验五 通信协议设计...
  11. spyder安装matplotlib
  12. Oracle 文字排序,按照拼音,姓氏笔画等
  13. Mac Mounty正常卸载方法(mount failed异常解决)
  14. 计算机组成原理 第四版 总线的主模块 总线的从模块,总线的基本概念
  15. 产品通过WHQL认证后的好处
  16. 北航计算机学院吴俊杰,吴俊杰老师在经管学院建院六十周年大会上的发言
  17. python转盘抽奖_Python使用Tkinter实现转盘抽奖器的步骤详解
  18. SDNU-多校训练赛2-[ABF]
  19. 删除电脑属性制造商_win7系统怎么修改系统制造商信息?
  20. DuiLib的第一个win32程序

热门文章

  1. Linux安装时遇到的问题 Intel VT-x处于禁用状态
  2. 065_VFPage中CallBack回调函数的解释
  3. C# DataGridView 全选 反选
  4. avalon2 非必填项的表单验证规则
  5. 华为实习日记——第三十七天
  6. ServletContextListener 启动SPRING加载数据到缓存的应用
  7. Java笔记——equals和==的区别
  8. java压缩单个文件
  9. 推荐几个rpm下载站点
  10. SharePoint 2010新体验9 - 内容管理器(Content Organizer)