【问题标题】:Contour plot coloured by clustering of points matlab通过点聚类matlab着色的等高线图
【发布时间】:2015-07-06 17:34:26
【问题描述】:

我有两个成对值的向量

size(X)=1e4 x 1; size(Y)=1e4 x 1

是否可以绘制某种contour plot 以最高密度的点制作轮廓?即最高聚类=红色,然后在其他地方渐变颜色?

如果您需要更多说明,请询问。 问候,

示例数据:

X=[53 58 62 56 72 63 65 57 52 56 52 70 54 54 59 58 71 66 55 56];  
Y=[40 33 35 37 33 36 32 36 35 33 41 35 37 31 40 41 34 33 34 37 ];
 scatter(X,Y,'ro');

感谢大家的帮助。还记得我们可以使用hist3

x={0:0.38/4:0.38}; % # How many bins in x direction
y={0:0.65/7:0.65}; % # How many bins in y direction

ncount=hist3([X Y],'Edges',[x y]);
pcolor(ncount./sum(sum(ncount)));
colorbar

有人知道为什么 hist3 中的edges 必须是单元格吗?

【问题讨论】:

  • 我需要更多说明。如果您可以绘制一些图像并发布一些示例数据(或创建它的方法),那就太好了。
  • @Andrey 这是一个示例散点图。我正在寻找的是从高密度到低密度点聚类的轮廓。我相信也有可能找到这些数据的质心。你怎么看?

标签: matlab


【解决方案1】:

这基本上是一个关于估计生成数据的概率密度函数,然后以一种好的和有意义的方式将其可视化的问题。为此,我建议使用比直方图更平滑的估计,例如 Parzen 窗口(直方图方法的推广)。

在下面的代码中,我使用了您的示例数据集,并估计了由您的数据范围设置的网格中的概率密度。您需要调整 3 个变量以用于原始数据;边框、Sigma 和 stepSize。

Border = 5;
Sigma = 5;
stepSize = 1;

X=[53 58 62 56 72 63 65 57 52 56 52 70 54 54 59 58 71 66 55 56];  
Y=[40 33 35 37 33 36 32 36 35 33 41 35 37 31 40 41 34 33 34 37 ];
D = [X' Y'];
N = length(X);


Xrange = [min(X)-Border max(X)+Border];
Yrange = [min(Y)-Border max(Y)+Border];


%Setup coordinate grid
[XX YY] = meshgrid(Xrange(1):stepSize:Xrange(2), Yrange(1):stepSize:Yrange(2));
YY = flipud(YY);

%Parzen parameters and function handle
pf1 = @(C1,C2) (1/N)*(1/((2*pi)*Sigma^2)).*...
         exp(-( (C1(1)-C2(1))^2+ (C1(2)-C2(2))^2)/(2*Sigma^2));

PPDF1 = zeros(size(XX));    

%Populate coordinate surface
[R C] = size(PPDF1);
NN = length(D);
for c=1:C
   for r=1:R 
       for d=1:N 
            PPDF1(r,c) = PPDF1(r,c) + ...
                pf1([XX(1,c) YY(r,1)],[D(d,1) D(d,2)]); 
       end
   end
end


%Normalize data
m1 = max(PPDF1(:));
PPDF1 = PPDF1 / m1;

%Set up visualization
set(0,'defaulttextinterpreter','latex','DefaultAxesFontSize',20)
fig = figure(1);clf
stem3(D(:,1),D(:,2),zeros(N,1),'b.');
hold on;

%Add PDF estimates to figure
s1 = surfc(XX,YY,PPDF1);shading interp;alpha(s1,'color');
sub1=gca;
view(2)
axis([Xrange(1) Xrange(2) Yrange(1) Yrange(2)])

注意,这个可视化实际上是 3 维的:

【讨论】:

  • 谢谢。这正是我一直在寻找的,特别是因为我的数据严格只有一个全局最大值。我需要彻底详细地研究一下。但我突然想到,在数据稀疏或包含多个“峰值”的情况下,它对这些现象的处理效果如何?
  • 我不太清楚你的意思。此方法高度依赖于您选择用于数据的 Sigma。如果正确选择(不太高也不太小),该方法应该返回一个可用的估计值。如果 Sigma 太小,您会在所有数据点周围看到小凸起;如果它太大,估计会变得太粗略,无法提取所有信息。请记住,所有这些估计方法都需要大量数据才能正常工作,并且估计仅在由数据点填充的区域内有效。
  • 是否有严格的方法来选择您的 sigma 值(可能基于数据变化?)?但是当数据明显是双峰时会发生什么。它能捕捉到峰顶之间的低谷吗?我会试试这个,看看会发生什么。
  • 没有严格的选择 sigma 的方法,但您可以查找非常常用的“Silverman 经验法则”,至少对于二维数据而言。它应该能够检测到峰之间的山谷。如果您有两个类别的案例,您是否有标签信息可以继续?
  • 是的,我知道我的数据向量来自哪些类。虽然在一维情况下,这种方法是一个很好的类预测器吗?
【解决方案2】:

在 mathworks 网站上观看这个 4 分钟的视频:

http://blogs.mathworks.com/videos/2010/01/22/advanced-making-a-2d-or-3d-histogram-to-visualize-data-density/

我相信这应该提供非常接近您需要的功能。

【讨论】:

  • 在 SO 上人们通常会解释链接的内容是什么,以防它在以后变得不可用......幸运的是它在将近 10 年后仍然可用...... =)
【解决方案3】:

我会将绘图覆盖的区域划分为一个网格,然后计算网格每个正方形中的点数。这是一个如何做到这一点的示例。

% Get random data with high density
X=randn(1e4,1);
Y=randn(1e4,1);

Xmin=min(X);
Xmax=max(X);
Ymin=min(Y);
Ymax=max(Y);
% guess of grid size, could be divided into nx and ny
n=floor((length(X))^0.25); 

% Create x and y-axis
x=linspace(Xmin,Xmax,n);
y=linspace(Ymin,Ymax,n);
dx=x(2)-x(1);
dy=y(2)-y(1);
griddata=zeros(n);
for i=1:length(X)
    % Calculate which bin the point is positioned in
    indexX=floor((X(i)-Xmin)/dx)+1;
    indexY=floor((Y(i)-Ymin)/dy)+1;
    griddata(indexX,indexY)=griddata(indexX,indexY)+1;
end
contourf(x,y,griddata)

编辑:Marm0t 回答中的视频使用了相同的技术,但可能以更好的方式解释它。

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多