星型坐标是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四个维度在区分这三类样本点的时候的权重相对较大。