首先,这无疑是一项作业(所以请不要提供完整的代码样本)。不过…
我需要在Matlab的神经网络工具箱中测试一个无监督算法和一个有监督算法。数据集是UCI人工字符数据库。问题在于,我已经接受了有监督算法的良好教程,但在无监督算法上却被放任自流。
所以我知道如何使用selforgmap
创建一个自组织映射,然后使用train(net, trainingSet)
对其进行训练。我不明白接下来该做什么。我知道它已经将我提供的数据聚类成(希望是)10个聚类(每个字母一个)。
那么有两个问题:
- 如何标记这些聚类(假设我有一个比较模式)?
- 这样做时,我是否试图将其转变为一个有监督的学习问题?
- 如何在(另一个)测试集上创建一个混淆矩阵以与有监督算法进行比较?
我觉得我在这里缺少一些概念上的或术语上的东西——我所有的搜索结果都是有监督学习技术。能指引正确的方向将不胜感激。我现有的代码如下:
P = load('-ascii', 'pattern');T = load('-ascii', 'target');% data needs to be translatedP = P';T = T';T = T(find(sum(T')), :);mynet = selforgmap([10 10]);mynet.trainparam.epochs = 5000;mynet = train(mynet, P);P = load('-ascii', 'testpattern');T = load('-ascii', 'testtarget');P = P';T = T';T = T(find(sum(T')), :);Y = sim(mynet,P);Z = compet(Y);% this gives me a confusion matrix for supervised techniques:C = T*Z'
回答:
由于你没有使用任何标记数据的部分,根据定义,你正在应用无监督方法。
“如何标记这些聚类(假设我有一个比较模式)?”
你可以尝试对标签集进行不同的扰动,并保留使比较模式上的平均误差(或准确率)最小化的那个。在聚类中,你可以随意标记你的聚类。可以把它想象成尝试不同的标签分配,直到最小化指定的性能指标。
“这样做时,我是否试图将其转变为一个有监督的学习问题?”
这取决于情况。如果你在聚类过程中明确使用了(已知)的数据点,那么这是半监督的。如果没有,你只是使用标签信息来评估和“比较”有监督的方法。这是一种监督形式,但不是基于训练集,而是基于最佳预期性能(即一个“代理”为聚类指定正确的标签)。
“如何在(另一个)测试集上创建一个混淆矩阵以与有监督算法进行比较?”
你需要一种方法将聚类转化为标记类。对于少量聚类(例如C <= 5
),你基本上可以创建C!
个矩阵,并保留使你的平均分类误差最小化的那个。然而,在你的情况下,C = 10
,这显然是不切实际的,并且会造成巨大的开销!
作为替代方案,你可以使用以下方法标记聚类(从而获得混淆矩阵):
- 半监督方法,其中聚类可以事先标记,或者通过属于已知聚类/类的种子数据引导标记过程。
- 对估计的聚类中心和真实标签之间的距离进行排序或查找。这将为每个聚类分配最接近或最相似的标签。