最近開始了模式識別的學習,在此之前需要對模式和模式類的概念有一個了解,這里使用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('多維隨機點的二維投影圖');
~~~

以上完整代碼可在此處下載:[http://download.csdn.net/detail/liyuefeilong/8499915](http://download.csdn.net/detail/liyuefeilong/8499915)