Chinaunix首页 | 论坛 | 博客
  • 博客访问: 723799
  • 博文数量: 98
  • 博客积分: 3257
  • 博客等级: 中校
  • 技术积分: 966
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-15 17:19
文章存档

2020年(1)

2018年(1)

2017年(1)

2016年(2)

2015年(2)

2013年(3)

2012年(24)

2011年(28)

2010年(4)

2009年(9)

2008年(23)

我的朋友

分类: 大数据

2013-07-24 10:58:56

%运行环境:matlab R2012a @ winxp in virtualbox4.2.16.  SOM_ToolBox V2.0 Mar_17_2005.
%    ==========================================================
%    SOM_DEMO2 - BASIC USAGE OF SOM TOOLBOX
%    ==========================================================

%    som_data_struct    - Create a data struct.
%    som_read_data      - Read data from file.
%
%    som_normalize      - Normalize data.
%    som_denormalize    - Denormalize data.
%
%    som_make           - Initialize and train the map. 
%
%    som_show           - Visualize map.
%    som_show_add       - Add markers on som_show visualization.
%    som_grid           - Visualization with free coordinates.
%
%    som_autolabel      - Give labels to map.
%    som_hits           - Calculate hit histogram for the map.

%    BASIC USAGE OF THE SOM TOOLBOX

%    SOM Toolbox基本使用流程如下: 
%      1. construct data set:创建数据集
%      2. normalize it         :归一化处理
%      3. train the map    :训练映射图
%      4. visualize map    :可视化展示
%      5. analyse results    :分析结果

%    对于前四项,如果都采用缺省选项,则非常简单,每步就一条命令搞定。
%    对于最后一项任务,toolbox提供了很多函数,需要根据分析需求的不同进行选择采用
%    一个通用缺省的函数是不存在的。 

%    STEP 1: CONSTRUCT DATA
%    ======================
%    toolbox提供了一个特别的结构体data struct,用于存储数据集相关的所有信息
%    可以采用SOM_DATA_STRUCT函数进行创建,其第一个参数是一个数据矩阵。

D = rand(1000,3); % 1000 samples from unit cube
sData = som_data_struct(D,'name','unit cube','comp_names',{'x','y','z'});
%    上面是采用1000个三维随机数创建了一个数据结构体,数据集的名字叫unit cube,三维变量分别为xyz。

%也可以采用som_read_data来读入一个数据文件,从而产生一个数据集。
%    下面代码是尝试从'iris.data'文件中读数据,如果读入错误(如找不到文件),则采用随机数产生一个仿真的数据集
try, 
  sDiris = som_read_data('iris.data');
catch
  echo off

  warning('File ''iris.data'' not found. Using simulated data instead.')
  
  D = randn(50,4); 
  D(:,1) = D(:,1)+5;     D(:,2) = D(:,2)+3.5; 
  D(:,3) = D(:,3)/2+1.5; D(:,4) = D(:,4)/2+0.3;
  D(find(D(:)<=0)) = 0.01; 
  
  D2 = randn(100,4); D2(:,2) = sort(D2(:,2));
  D2(:,1) = D2(:,1)+6.5; D2(:,2) = D2(:,2)+2.8; 
  D2(:,3) = D2(:,3)+5;   D2(:,4) = D2(:,4)/2+1.5;
  D2(find(D2(:)<=0)) = 0.01; 
  
  sDiris = som_data_struct([D; D2],'name','iris (simulated)',...
  'comp_names',{'SepalL','SepalW','PetalL','PetalW'});
  sDiris = som_label(sDiris,'add',[1:50]','Setosa');
  sDiris = som_label(sDiris,'add',[51:100]','Versicolor');
  sDiris = som_label(sDiris,'add',[101:150]','Virginica');
  
  echo on
end

%    下面代码是将iris数据集的思维数据通过可视化形式展现
echo off 
k=1;
for i=1:4, 
  for j=1:4, 
    if i==j, 
      subplot(4,4,k);  %划分出4X4的十六个子绘图区域
      hist(sDiris.data(:,i)); title(sDiris.comp_names{i})  %对角线(i==j)绘制数据直方图。
    elseif i
      subplot(4,4,k); 
      plot(sDiris.data(:,i),sDiris.data(:,j),'k.')  %右上区域(i
      xlabel(sDiris.comp_names{i})
      ylabel(sDiris.comp_names{j})
    end
    k=k+1;
  end
end
echo on
%    绘图效果如下:

%    STEP 2: DATA NORMALIZATION
%    ==========================
%    由于SOM算法采用欧式距离进行相似性度量,不同变量如果取值范围不同,
%    那么取值较大的变量将可能占据主导地位,因此需要对变量进行归一化处理。
%    即将每个变量的取值范围都归一化到[0,1]范围。命令很简单,而且还可通过som_denormalize进行逆操作。
sDiris = som_normalize(sDiris,'var');

x = sDiris.data(1,:)

orig_x = som_denormalize(x,sDiris)

%    STEP 3: MAP TRAINING
%    ====================

%     SOM_MAKE函数用于训练 SOM. 缺省情况下,它
%    首先确定som大小, 然后采用线性方法进行初始化
%    最后才有批量算法(batch algorithm)进行训练
%    SOM_DEMO1 对训练过程有更详细的描述。
sMap = som_make(sDiris);

%    由于iris数据集中对每个数据有分类标注,可以采用如下函数进行自动标注。
sMap = som_autolabel(sMap,sDiris,'vote');

%    STEP 4: VISUALIZING THE SELF-ORGANIZING MAP: SOM_SHOW
%    =====================================================
%    采用som_show即可将som可视化展示
colormap(1-gray)  %采用反转灰度
som_show(sMap,'norm','d')
%    SOM_SHOW_ADD和subplot可用于在所有图形中加标记,如下:
h=zeros(sMap.topol.msize); h(1,2) = 1;
som_show_add('hit',h(:),'markercolor','r','markersize',0.5,'subplot','all')
clf
clc
som_show(sMap,'umat','all','empty','Labels')
som_show_add('label',sMap,'Textsize',8,'TextColor','r','Subplot',2)
h = som_hits(sMap,sDiris);
som_show_add('hit',h,'MarkerColor','r','Subplot',1)
som_show_clear('hit',1);%还可采用此函数来清除上一步添加的绘图信息
som_show_clear('lab',2); %清除上图右边的标签标记

h1 = som_hits(sMap,sDiris.data(1:50,:));
h2 = som_hits(sMap,sDiris.data(51:100,:));
h3 = som_hits(sMap,sDiris.data(101:150,:));

som_show_add('hit',[h1, h2, h3],'MarkerColor',[1 0 0; 0 1 0; 0 0 1],'Subplot',1)
                                                                      %相当于R;G;B

%分类统计命中直方图
clf
clc
%    采用SOM_GRID可以绘制输出层的Som图形
subplot(2,2,1)
som_grid(sMap,'Linecolor','k')
view(0,-90), title('Map grid')
%    采用表面曲线(surface plot)还可以绘制距离矩阵
subplot(2,2,2)
Co=som_unit_coords(sMap); 
U=som_umat(sMap); 
U=U(1:2:size(U,1),1:2:size(U,2));
som_grid(sMap,'Coord',[Co, U(:)],'Surf',U(:),'Marker','none');
view(-80,45), axis tight, title('Distance matrix')
%    绘制原始数据点信息,前三维作为坐标,第四维用于确定标记点大小
subplot(2,2,3)
M = som_denormalize(sMap.codebook,sMap);
som_grid(sMap,'Coord',M(:,1:3),'MarkerSize',M(:,4)*2)
view(-80,45), axis tight, title('Prototypes')
%    在上述基础上,采用不同颜色绘制数据点的分类信息
subplot(2,2,4)
som_grid(sMap,'Coord',M(:,1:3),'MarkerSize',M(:,4)*2)
hold on
D = som_denormalize(sDiris.data,sDiris); 
plot3(D(1:50,1),D(1:50,2),D(1:50,3),'r.',...
      D(51:100,1),D(51:100,2),D(51:100,3),'g.',...
      D(101:150,1),D(101:150,2),D(101:150,3),'b.')
view(-72,64), axis tight, title('Prototypes and data')

%    STEP 5: ANALYSIS OF RESULTS
%    ===========================
%    这一步的使用,主要还是取决于用户根据不同的应用场景进行编程实现,toolbox提供的简单函数如:
[qe,te] = som_quality(sMap,sDiris)
%主要用于统计数据质量误差和拓扑误差。

阅读(9514) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

vicky_ye492017-05-16 15:52:05

你好,我想咨询一下,您的代码在运行的过程中的som_show函数那块会不会报错,按照您的代码看下来之后发现会报错,不知道问题出在哪里,我怀疑是工具包中的函数有问题,您能抽空回复一下吗?谢谢