我需要对使用k-means聚类的多维数据集数据集执行降维。该数据包含从放置在触觉手套上的传感器的传感器读数获得的正和负实数。在表示动作时捕获数据,如绘图字母“A”为
0.1373 -1.8764
-1.7020 -0.8322
0.4862 0.8276
-0.0078 1.3597
0.9008 1.8043
2.9751 0.7125
-0.3257 0.1754
现在,我的困惑是
K=3; load('b2.txt'); data = b2; numObservarations = length(data); %% cluster opts = statset('MaxIter', 500, 'Display', 'iter'); [clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ... 'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3); %% plot data+clusters figure, hold on scatter3(data(:,1),data(:,2),data(:,3), 50, clustIDX, 'filled') scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled') hold off, xlabel('x'), ylabel('y'), zlabel('z')
如何纠正这个?出了什么问题?
在获取所有维度的集群后,我现在通过其集群标签将数据表示为
1 1 3 2
等等。
答案 0 :(得分:2)
您提供的代码可以很好地处理您提供的 2D 数据集(两个功能)的轻微修改。
尝试如下:
data=[ 0.1373 -1.8764
-1.7020 -0.8322
0.4862 0.8276
-0.0078 1.3597
0.9008 1.8043
2.9751 0.7125
-0.3257 0.1754];
numObservarations = length(data);
K=3
%% cluster
%opts = statset('MaxIter', 500, 'Display', 'iter');
[clustIDX, clusters, interClustSum, Dist] = ...
kmeans(data, K, 'MaxIter', 500, 'Display', 'iter', ...
'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3);
%% plot data+clusters
figure, hold on
scatter(data(:,1),data(:,2), 50, clustIDX, 'filled')
scatter(clusters(:,1),clusters(:,2), 200, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y')
结果如下:
您提供的数据集再次包含 2 功能,因此它基本上是2D。
据我所知,kmeans
对数据进行聚类,它本身不会降低维数(我等待其他人阅读此内容以纠正我)。对于维数降低,您真正想要做的是PCA或类似的。在PCA之后,您可以将数据投影到主要组件轴上,并以“低维”方式显示集群。
我实际上并不理解时间顺序的含义,但是如果时间事件和功能之间存在某种相关性,您可以期望kmeans
根据这些事件进行分类(间接)。
这是另一个例子。这次聚类大小为3.聚类的质心在clusters
以上的变量kmeans
输出中。
左侧的图显示了根据时间着色的2D要素空间中的点(颜色条显示相对时间与颜色的关系)。中间的图显示了根据新的色标分配了什么聚类点,与右图相同的色标显示了质心的位置。该图的要点是显示特征所显示的时间规律性。
关于你关于时间排序的问题,似乎kmeans
可以揭示特征中隐含的时间相关性(如果这就是你的意思),如下面的clustIDX
对比图所示时间:
但我不知道它与其他处理算法的比较(为什么它会有利)。我会前往dsp.stackexchange寻求更好的答案。
使用以下代码生成子图:
subplot(121);
scatter(data(:,2),data(:,3), 50, clustIDX, 'filled')
axis tight
box on
xlabel('feature 1'), ylabel('feature 2')
title('labelled points')
subplot(122);
scatter(clusters(:,2),clusters(:,3), 200, (1:K)', 'filled')
axis tight
box on
xlabel('feature 1'),ylabel('feature 2')
title('clusters')
第二个情节:
figure
scatter([1:length(clustIDX)],clustIDX, 50, clustIDX, 'filled')
xlabel('time'),ylabel('cluster')
box on
axis tight
title('labelled points in time domain')