用星坐标(Star Coordinates)表示高维数据

来源:互联网 发布:全职高手烽火知韩txt 编辑:程序博客网 时间:2024/06/05 23:59

星型坐标是Kandogan在2001年提出的一种高维数据的可视化方法。这种方法类似于向量的合成,在二维平面上选取一点作为坐标原点,对于D维的数据,从原点出发作出D个向量(轴)代表这D个维度,向量(轴)的长度代表在星坐标表示时各个维度的权重。这种方法本质上是一个向量合成,类似于我们在物理中学的力的合成。也可以说是一个从D维到2维的一个投影变换。要实现较好的效果,要使每一个数据点到它所属类的类中心点的距离之和与到所有数据点的中心的距离之和的比尽可能小一点。

下面是一个运用星图表示数据的例子

clc,clearload 'Wine.mat';LENGTH = 178;Label = Wine(:,1);Loop = 5;%模拟退火的内循环次数%%%%%%%%%   规范化   %%%%%%%%%%%%%%minmax = zeros(14,2);   %第一列存储最小值,第二列存储最大值minmax(1,1) = 0;minmax(1,2) = 0;for i = 2:14    minmax(i,1) = Wine(1,i);    minmax(i,2) = Wine(1,i);endfor i = 1:LENGTH    for j = 2:14        if minmax(j,1)>Wine(i,j)            minmax(j,1) = Wine(i,j);        end        if minmax(j,2)<Wine(i,j)            minmax(j,2) = Wine(i,j);        end    endendfor i = 1:LENGTH    for j = 2:14        Wine(i,j) = (Wine(i,j)-minmax(j,1))/(minmax(j,2)-minmax(j,1))*1000-500;    endend%%%%%%%%%%    规范化结束   %%%%%%%%%%%%%X = (Wine(:,2:14))';P = ones(2,13);Q = ones(2,13);%energy(Y,Label,3,LENGTH)%%%模拟退火算法T = 15000;Tf = 0.0001;alpha = 0.98;while T>Tf    for i = 1:Loop        position1 = 0;        position2 = 0;        while position2<1 || position2>13            position2 = round(13*rand);        end        while position1<1 || position1>2            position1 = round(2*rand);        end        change = rand-0.5;        Q = P;        Q(position1,position2) = Q(position1,position2)+change;        Yp = P*X;        Yq = Q*X;        ep = energy(Yp,Label,3,LENGTH);        eq = energy(Yq,Label,3,LENGTH);        de = eq-ep;                if de>0            P = Q;        else            if exp(de/T)>rand                P = Q;            else                Q = P;            end        end    end    T = T*alpha;endY = P*X;for i = 1:LENGTH    if Label(i)==1        scatter(Y(1,i),Y(2,i),'.r')        hold on;    end    if Label(i)==2        scatter(Y(1,i),Y(2,i),'.g')        hold on;    end    if Label(i)==3        scatter(Y(1,i),Y(2,i),'.b')        hold on;    endend%显示轴linelength = 1000;dname = {'1','2','3','4','5','6','7','8','9','10','11','12','13'};for i = 1:13    line([0 P(1,i)]*linelength,[0 P(2,i)]*linelength,'color','b')    hold on;    text(P(1,i)*linelength,P(2,i)*linelength,dname(i));        angle = 0:pi/100:2*pi;    R = sqrt(P(1,i)*P(1,i)+P(2,i)*P(2,i))*linelength;    circlex = R*cos(angle);    circley = R*sin(angle);    plot(circlex,circley,'-')    hold on;end
效果如下所示,考虑到随着退火算法收敛程度加大,同一类的数据会压缩到一起,所以这里的迭代次数设置的不是很大。在这里面可以看到第7,12,11,10四个维度在区分这三类样本点的时候的权重相对较大。




原创粉丝点击