1. 程式人生 > >模式識別:利用MATLAB生成模式類

模式識別:利用MATLAB生成模式類

最近開始了模式識別的學習,在此之前需要對模式和模式類的概念有一個瞭解,這裡使用MATLAB實現一些模式類的生成。在此之前,引用百科上對於模式識別和模式類的定義,也算加深以下了解:

    模式識別(Pattern Recognition):人類在日常生活的每個環節,從事著模式識別的活動。可以說每個有正常思維的人,在他沒有入睡時都在進行模式識別的活動。坐公共汽車找汽車站,騎車判別可行進道路,對觀察到的現象作出判斷,對聽到的聲音作出反應,判斷東西的好與壞以及水果的成熟與否等等都是人們判斷是非,判別事物的過程。但是對模式識別這個詞就顯得陌生而難以理解了。確切地說,模式識別在這裡是針對讓計算機來判斷事物而提出的,如檢測病理切片中是否有癌細胞,文字識別,話語識別,影象中物體識別等等。該學科研究的內容是使機器能做以前只能由人類才能做的事,具備人所具有的、對各種事物與現象進行分析、描述與判斷的部分能力。 
    模式類與模式,或者模式與樣本在集合論中是子集與元素之間的關係。當用一定的度量來衡量兩個樣本,而找不出它們之間的差別時,它們在這種度量條件下屬於同一個等價類。這就是說它們屬於同一子集,是一個模式,或一個模式類。而不同的模式類之間應該是可以區分的,它們之間應有明確的界線。但是對實際樣本來說,有時又往往不能對它們進行確切的劃分,即在所使用的度量關係中,分屬不同的類別的樣本卻表現出相同的屬性,因而無法確鑿無誤地對它們進行區分。例如在癌症初期,癌細胞與正常細胞的界線是含糊的,除非醫術有了進一步發展,能找到更準確有效的分類方法。 

下面是練習:

在Matlab 中提供了很多產生隨機數和隨機向量的函式,以及計算隨機函式的概率密度值的函式。下面是幾個較常用的函式:
rand() 生成均勻分佈隨機數
randn() 生成高斯分佈隨機數
mvnrnd() 生成多元高斯分佈的隨機向量矩陣
mvnpdf() 計算多元高斯分佈的概率密度函式值

在閱讀了上述函式的MATLAB線上幫助後,完成下面的程式實現,分為三個練習:

練習一:在一維區間[10,70]中,生成1000個均勻分佈的隨機數,然後統計並繪製這些數的直方圖;在二維區間[1,5]☓[20,30]中,生成5000 個均勻分佈的二維隨機點,並繪製出它們的二維散點圖;在三維區間[10,50]☓[30,60]☓[10,15]中,生成10000 個均勻分佈的三維隨機點量,並繪製出它們的三維散點圖。

% rand()生成區間[10,70]的1000個隨機數
% 並顯示直方圖

for i = 1:1000 
a(i) = rand() * 60 + 10;
end
b = hist(a, 10:70);
figure,bar(10:70, b, 'g');
grid on
title('rand()產生1000個[10,70]的隨機數直方圖');

for k = 1:5000
    TwoDimension(k,1) = rand() * 4 + 1;
    TwoDimension(k,2) = rand() * 10 + 20;
end
figure,plot(TwoDimension(:,1), TwoDimension(:,2
), '*'); xlim([0 6]); ylim([10 40]); grid on title('在[1,5]*[20,30]中產生5000個均勻分佈的二維隨機點'); for j = 1:10000 ThreeDimension(j,1) = rand() * 40 + 10; ThreeDimension(j,2) = rand() * 30 + 30; ThreeDimension(j,3) = rand() * 5 + 10; end figure,scatter3(ThreeDimension(:,1),ThreeDimension(:,2),ThreeDimension(:,3),'r'); xlim([0 60]); ylim([20 70]); zlim([0 20]); grid on; title('產生10000個均勻分佈的三維隨機點');

輸出一維、二維和三維隨機點生成效果(邊界限定參照要求):

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

下面是在練習一基礎上的擴充套件:利用均勻分佈的隨機數函式,編寫可以生成具有三角分佈、以及梯形分佈的隨機數的函式。用它們生成一定數量的樣本資料,並繪製資料分佈圖。

% 產生5000個隨機點,然後根據公式剔除三角形外的點
n = 5000;
x = rand(n,2) * 2;
% 變數名 = @(輸入引數列表)運算表示式
fx = @(x)(x < 1).*(2*x)+(x >= 1).*(4-2*x);
g=0:0.2:2;
y=fx(g);
% 繪製邊界直線,設定直線粗細
figure,plot(g,y,'r-','linewidth',3);
hold on

% 判斷元素在y軸上的值是否超出三角形的邊界
% 對邊界外的點標記為一個值
for t = 1:n
    if x(t,2) > fx(x(t,1))
       x(t,:) = [0, 0]; 
    end
end
% 掃描標定的值並刪除這些元素,剩下邊界內的元素
for t = n:-1:1
    if x(t,:) == [0, 0]
       x(t,:) = [];
    end
end
plot(x(:,1),x(:,2),'o');
title('若干個三角分佈的隨機點');
% 繪製隨機點分佈直方圖
[f, y] = hist(x(:,1), g);
figure,bar(y,f,1); 
title('隨機點分佈直方圖');

% 產生5000個隨機點,然後根據公式剔除梯形外的點
n = 5000;
x = rand(n,2) * 3;
% 變數名 = @(輸入引數列表)運算表示式
fx = @(x)(x <= 1).*(3*x)+( x > 1 & x <= 2).*3 + (x > 2).*(9-3*x);
g=0:0.1:3;
y=fx(g);
% 繪製邊界直線,設定直線粗細
figure,plot(g,y,'r-','linewidth',3); 
hold on

% 判斷元素在y軸上的值是否超出梯形的邊界
% 對邊界外的點標記為一個值
for t = 1:n
    if x(t,2) > fx(x(t,1))
       x(t,:) = [0, 0]; 
    end
end
% 掃描標定的值並刪除這些元素,剩下邊界內的元素
for t = n:-1:1
    if x(t,:) == [0, 0]
       x(t,:) = [];
    end
end
plot(x(:,1),x(:,2),'o');
title('若干個梯形分佈的隨機點');
% 繪製隨機點分佈直方圖
[f, y] = hist(x(:,1), g);
figure,bar(y,f,1); 
title('隨機點分佈直方圖');

輸出三角分佈和梯形分佈的隨機點結果、直方圖:

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

練習二:生成兩組各1000個具有不同均值和方差的一維高斯分佈的隨機數,然後統計並繪製這些點的直方圖;生成三組各1000 個具有不同均值向量和協方差矩陣的二維隨機向量,並繪製出它們的二維散點圖;生成五組各1000個具有不同均值向量和協方差矩陣的三維隨機向量,並繪製出它們的三維散點圖。進一步,繪製上述三維隨機向量資料集合的二維投影散點圖。可以指定模式向量的其中兩個分量,將集合中每個向量的這兩個分量提取出來構成一個2維模式子分量的向量集合,然後在二維平面上畫出該子分量集合的二維散點圖。

% 使用randn()兩組1000個隨機數
% 並顯示直方圖
% 產生一個隨機分佈的指定均值和方差的矩陣:將randn產生的結果乘以標準差,然後加上期望均值即可。
for i = 1:1000 
Gaussian(i,1) = sqrt(1) * randn() + 5;
Gaussian(i,2) = sqrt(2) * randn() + 10;
end
G1 = hist(Gaussian(:,1), 0:20);
G2 = hist(Gaussian(:,2), 0:20);
figure,subplot(1,2,1),bar(0:20, G1, 'g');
grid on
title('均值為5,方差為1的高斯分佈隨機數直方圖');
subplot(1,2,2),bar(0:20, G2, 'g');
grid on
title('均值為10,方差為2的高斯分佈隨機數直方圖');

% mvnrnd(mu,sigma,n)
% 產生二維正態隨機數,mu為期望向量,sigma為協方差矩陣,n為規模。
mu = [2 2];  
sigma = [1 0; 0 2];
r = mvnrnd(mu,sigma,1000);
figure,plot(r(:,1),r(:,2),'r+');
hold on;
mu = [7 10];
sigma = [ 3 0; 0 3];
r2 = mvnrnd(mu,sigma,1000);
plot(r2(:,1),r2(:,2),'b*')
hold on;
mu = [15 20];
sigma = [ 2 0; 0 2];
r3 = mvnrnd(mu,sigma,1000);
plot(r3(:,1),r3(:,2),'go')
grid on;
title('三組高斯二維隨機向量散點圖');

% 產生五組不同的三維高斯隨機向量
mu1 = [2 2 2];  
sigma1 = [1 0 0; 0 2 0; 0 0 3];
r1 = mvnrnd(mu1,sigma1,1000);

mu2 = [6 0 -4];  
sigma2 = [1 0 0; 0 2 0; 0 0 3];
r2 = mvnrnd(mu2,sigma2,1000);

mu3 = [-9 7 0];  
sigma3 = [1 0 0; 0 2 0; 0 0 3];
r3 = mvnrnd(mu3,sigma3,1000);

mu4 = [0 15 -2];  
sigma4 = [1 0 0; 0 2 0; 0 0 3];
r4 = mvnrnd(mu4,sigma4,1000);

mu5 = [-12 12 -12];  
sigma5 = [1 0 0; 0 2 0; 0 0 3];
r5 = mvnrnd(mu5,sigma5,1000);

figure,plot3(r1(:,1),r1(:,2),r1(:,3),'r+',...
             r2(:,1),r2(:,2),r2(:,3),'g+',...
             r3(:,1),r3(:,2),r3(:,3),'b+',...
             r4(:,1),r4(:,2),r4(:,3),'m+',...
             r5(:,1),r5(:,2),r5(:,3),'k+');
grid on
title('五組不同的三維高斯隨機向量');

% 繪製三維隨機向量的二維投影散點圖
figure,plot(r1(:,2),r1(:,3),'r+',...
            r2(:,2),r2(:,3),'g+',...
            r3(:,2),r3(:,3),'b+',...
            r4(:,2),r4(:,3),'m+',...
            r5(:,2),r5(:,3),'k+');
grid on
title('三維高斯隨機向量的二維投影,取第2、3維');

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

練習三:確定一個二維的均值向量和協方差矩陣,然後利用matlab 中的meshgrid 函式生成一個二維網格,利用mvnpdf 函式計算在每個網格點上的概率密度函式值,並繪製出這些函式值的三維曲面圖。

% 用meshgird,mvnpdf等函式繪製三維網格圖
mu = [0 0]; 
SIGMA = [1 0; 0 1]; 
[X,Y] = meshgrid(-5:0.2:5, -5:0.2:5); %在XOY面上,產生網格
p = mvnpdf([X(:),Y(:)],mu,SIGMA); % 求取聯合概率密度,相當於Z軸
p = reshape(p,size(X)); % 將Z值對應到相應的座標上
mesh(X,Y,p); % 繪製
title('三維正態分佈圖曲面圖');

這裡寫圖片描述

擴充套件實驗2,編寫一個生成N 個d 維向量的混合高斯類資料集的函式。其中,生成的資料集中共有N個模式向量,它們分成c 類。各個類對應的樣本數分別為Ni,i = 1, 2, …, c,服從N(mi,Si),i = 1, 2, …, c 的高斯分佈, mi,Si 分別是第i 類的均值向量和協方差矩陣。取不同的值,在二維空間和三維空間中生成資料,並繪製出散點圖進行驗證。這裡我們建立一個函式實現這個功能MixGaussian():

% 隨機點個數N ,類別C ,維度d ,均值mu, 方差sigma
function result = MixGaussian(N, C, d, mu, sigma)
color = {'r.', 'g.', 'm.', 'b.', 'k.', 'y.'}; % 用於存放不同類資料的顏色
% if nargin <= 3 & N < 0 & C < 1 & d < 1
%   error('引數太少或引數錯誤');
if d == 1
        for i = 1 : C
            for j = 1 : N/C
            r(j,i) = sqrt(sigma(1,i)) * randn() + mu(1,i);
            end
            X = round(mu(1,i)-5);
            Y = round(mu(1,i) + sqrt(sigma(1,i))+5);
            b = hist(r(:,i), X:Y);
            subplot(1,C,i),bar(X:Y, b,'b');
            title('三類一維隨機點的分佈直方圖');
            grid on
        end
elseif d == 2
            for i = 1:C
                r(:,:,i) = mvnrnd(mu(:,:,i),sigma(:,:,i),round(N/C));
                plot(r(:,1,i),r(:,2,i),char(color(i)));
                hold on;
            end
elseif d == 3
            for i = 1:C
                r(:,:,i) = mvnrnd(mu(:,:,i),sigma(:,:,i),round(N/C));
                plot3(r(:,1,i),r(:,2,i),r(:,3,i),char(color(i)));
                hold on;
            end
else disp('維數只能設定為1,2或3');
end
result = r;

效果如下,根據輸入的維度、方差、均值等引數的不同均可以輸出模式類:

這裡寫圖片描述

擴充套件實驗3,編寫一個繪製由c類共N個d 維模式向量構成的多模式類集合的二維投影繪圖函式。其中,模式的類別標記已知,不同類別的模式繪製時用不同的顏色表示。其中,d維模式的2維子空間,簡單來說就是由d 維模式向量中的其中2個分量構成向量空間,在作圖時以這兩個分量做為座標量,這裡定義一個函式TwoDProject()。

% 輸入資料,輸出二維投影,X,Y為座標軸選擇
function TwoDProject(data, X, Y)
color = {'r.', 'g.', 'm.', 'b.', 'k.', 'y.'}; % 用於存放不同類資料的顏色
figure;
[a,b,c] = size(data);
if X == 1 && Y == 2
    for i = 1:c 
    plot(data(:,X,i),data(:,Y,i),char(color(i)));
    hold on;
    end
elseif X == 1 && Y == 3
    for i = 1:c 
    plot(data(:,X,i),data(:,Y,i),char(color(i)));
    hold on;
    end
elseif X == 2 && Y == 3
    for i = 1:c 
    plot(data(:,X,i),data(:,Y,i),char(color(i)));
    hold on;
    end
else 
    disp('維數設定錯誤');
end
    grid on;
    title('多維隨機點的二維投影圖');

這裡寫圖片描述