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

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

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

clc,clear
load '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);
end

for 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
    end
end

for i = 1:LENGTH
    for j = 2:14
        Wine(i,j) = (Wine(i,j)-minmax(j,1))/(minmax(j,2)-minmax(j,1))*1000-500;
    end
end
%%%%%%%%%%    规范化结束   %%%%%%%%%%%%%

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;
end


Y = 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;
    end
end

%显示轴
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四个维度在区分这三类样本点的时候的权重相对较大。




评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值