最近在项目中,为了算法结果的可视化,需要用到混淆矩阵(Confusion Matrix),而网上资源大多是基于Python绘制的混淆矩阵,并且是输出图片格式,并不能响应用户点击,今天以一个简单的小例子,简述如何通过WPF绘制混淆矩阵,并可响应用户点击事件,仅供学习分享使用,如有不足之处,还请指正。
什么是混淆矩阵?
在机器学习中, 混淆矩阵是一个误差矩阵, 常用来可视化地评估监督学习算法的性能. 混淆矩阵大小为 (n_classes, n_classes) 的方阵, 其中 n_classes 表示类的数量. 这个矩阵的每一行表示真实类中的实例, 而每一列表示预测类中的实例 (Tensorflow 和 scikit-learn 采用的实现方式). 也可以是, 每一行表示预测类中的实例, 而每一列表示真实类中的实例 (Confusion matrix From Wikipedia 中的定义). 通过混淆矩阵, 可以很容易看出系统是否会弄混两个类, 这也是混淆矩阵名字的由来.
混淆矩阵是一种特殊类型的列联表(contingency table)或交叉制表(cross tabulation or crosstab). 其有两维 (真实值 "actual" 和 预测值 "predicted" ), 这两维都具有相同的类("classes")的集合. 在列联表中, 每个维度和类的组合是一个变量. 列联表以表的形式, 可视化地表示多个变量的频率分布.
对于应用程序开发人员而言,混淆矩阵就是一个二维数组,分别表示预测值和真实值,里面的值表示对应值的占比。
开发步骤
创建WPF应用程序项目
在了解了混淆矩阵的用途和原理后,就可以着手去开发,首先创建一个WPF应用程序项目,然后创建模型MatrixM,主要包括标题,x轴,y轴的标签和刻度说明,数据,颜色设置。如下所示:
public class MatrixM:ObservableObject
{
private string title;
public string Title { get { return title; } set { SetProperty(ref title, value); } }
private string xLabel;
public string XLabel { get { return xLabel; } set { SetProperty(ref xLabel, value); } }
private string yLabel;
public string YLabel { get { return yLabel; } set { SetProperty(ref yLabel,value); } }
private string[] yaxis;
public string[] Yaxis { get { return yaxis; } set { SetProperty(ref yaxis, value); } }
private string[] xaxis;
public string[] Xaxis { get { return xaxis; } set { SetProperty(ref xaxis, value); } }
public double[,] Data { get; set; }
private Color minBrush;
public Color MinBrush { get { return minBrush; } set { SetProperty(ref minBrush, value); } }
private Color maxBrush;
public Color MaxBrush { get { return maxBrush; } set { SetProperty(ref maxBrush, value); } }
}
注意:在本示例中,矩阵的数据采用二维数组进行存储。
构造数据
构造示例数据,在实际开发中,数据来源于算法的真实分析,本例主要用于演示前端开发,所以构造一些测试数据,如下所示:
private MatrixM dataM;
public MatrixM DataM { get { return dataM; } set { SetProperty(ref dataM,value); } }
private UniformGrid matrix;
public MainWindo