Matlab機器學習3(Machine Learning Onramp)

Explore_OuO發表於2020-10-27

Engineering Features

計算統計特性(量化字母的形狀)

有什麼統計資料可以提供關於字母形狀的資訊呢?不同的字母會有不同的點分佈。

% 匯入資料
load sampleletters.mat
plot(b1.Time,b1.X)
hold on
plot(b2.Time,b2.X)
hold off
plot(b1.Time,b1.Y)
hold on
plot(b2.Time,b2.Y)
hold off

% 計算字母b的比例
aratiob = range(b1.Y)/range(b1.X)
% 計算中值,使用omitnan引數消除NaN值的影響
medxb = median(b1.X,"omitnan")
medyb = median(b1.Y,"omitnan")

字母經過預處理,其均值為0(在X和Y中)。中值對異常值的敏感性低於均值。比較平均值和中位數可以讓我們瞭解一個分佈有多不對稱。

% 平均絕對偏差(mean absolute deviation, MAD)
devxb = mad(b1.X)	% mad函式自動忽略NaNs
devyb = mad(b1.Y)

值的擴散程度可以用平均絕對值偏差、標準差和方差來測量,每一項都是計算偏離均值的平均值。

然後對其它的字母樣本做了重複的統計特性的計算。下圖中繪製了8個字母樣本的長寬比(aspect ratio)和字母橫向的平均絕對值偏差(mean absolute deviation)在這裡插入圖片描述
對比字母b和d,確實這些統計特效能夠反映出字母形狀上的不同。
在這裡插入圖片描述
在這裡插入圖片描述

尋找峰值

區域性極小值和極大值通常是一個訊號的重要特徵。islocalminislocalmax函式能夠實現尋找峰值的功能。

load sampleletters.mat
% islocalmin和islocalmax會返回一個與輸入資料等長的向量,峰值處置1。
idxmin = islocalmin(m1.X)
idxmax = islocalmax(m1.X)

plot(m1.Time,m1.X)
hold on
plot(m1.Time(idxmin),m1.X(idxmin),"o")
plot(m1.Time(idxmax),m1.X(idxmax),"s")
hold off

在這裡插入圖片描述
區域性極小值和極大值通過計算訊號中每個值的突出度來定義。突出值是衡量一個值與周圍其他值之間的比較。您可以通過從islocalmin或islocalmax獲得第二個輸出來獲得訊號中每個點的突出值。

[idx,prom] = islocalmin(m1.X);
plot(m1.Time,prom)

在這裡插入圖片描述

% 通過引數指定大於多少才是峰值
idxmin = islocalmin(m1.X,"MinProminence",0.1)
idxmax = islocalmax(m1.X,"MinProminence",0.1)

計算導數

檢測書寫在平板上的字母的一個重要方面是在字母書寫過程中有用的資訊。即橫縱位置隨時間變換的斜率。
對於離散的資料點,估計速度通過使用有限差分近似v =Δx /Δt。

load sampleletters.mat
plot(m2.Time,m2.X)
grid
dX = diff(m2.X);
dT = diff(m2.Time);
dXdT = dX./dT;

diff函式計算相鄰兩個元素之間的差值。所以輸出會比輸入少一個元素。在繪圖時需要注意。
在這裡插入圖片描述
在這裡插入圖片描述

% 觀察dXdT和dYdT的最大值
maxdx = max(dXdT)
dYdT = diff(m2.Y)./dT;
maxdy = max(dYdT)
% 結果maxdx=4.2971; maxdy=Inf

由於資料收集過程的解析度的限制,資料包含一些重複的值。如果位置和時間都是重複的,那麼差值都為0,則0/0=NaN。但是,如果位置值有非常輕微的不同,那麼導數將是Inf(非零除以0)。

注意,max忽略NaN,但不忽略Inf,因為Inf大於任何有限值。但是,對於這個應用程式,NaN和Inf都可以忽略,因為它們表示重複的資料。可以使用standardizeMissing函式將一系列的值轉化為NaN

dYdT = standardizeMissing(dYdT,Inf);
maxdy = max(dYdT)

計算相關(Correlations)

在這裡插入圖片描述
左邊的一對訊號與右邊的一對訊號具有明顯不同的形狀。但是兩組訊號之間的關係是相似的,在藍色區域,上訊號是增加的,下訊號是減少的,在黃色區域是相反的。Correlation試圖衡量這種相似性,而不管訊號的形狀如何。

字母V的前半部分,水平位置與垂直位置呈較強的線性負相關,水平位置增大,垂直位置成比例減小。同樣的,在後半段,位置也有很強的正相關,當水平位置增加時,垂直位置也成比例增加。

% corr函式計算變數之間的線性相關。
load sampleletters.mat
plot(v2.X,v2.Y,"o-")
C = corr(v2.X,v2.Y)	% corr函式計算變數之間的線性相關。

因為這兩個變數都包含缺失的資料,所以C是NaN。您可以使用“Rows”選項來指定如何避免丟失值。

C = corr(v2.X,v2.Y,"Rows","complete")

相關係數總是在-1和+1之間。係數-1表示完全負線性相關,係數+1表示完全正線性相關,係數為0表示不存線上性相關。在這種情況下,只有一個適度的相關性,因為計算已經在整個訊號上執行。分開考慮訊號的兩半可能更有用。

% 要計算每一對變數之間的相關性,可以向corr函式傳遞一個矩陣,其中每個變數是矩陣的一列。
M = [v2.X(1:11) v2.Y(1:11) v2.X(12:22) v2.Y(12:22)]
Cmat = corr(M,"Rows","complete")

自動化特徵提取

一旦你決定你想要的特徵提取,需要應用適當的計算每個樣本的資料集。自動化這個過程的第一步是讓一個自定義函式功能的資料作為輸入,並返回一個陣列作為輸出。

目前,該指令碼為給定的字母(儲存在變數letter中)計算6個特性。這六個特性儲存在六個單獨的變數中。
可以使用table函式將單獨的變數組合到一個表中。

load sampleletters.mat
letter = b1;

aratio = range(letter.Y)/range(letter.X)
idxmin = islocalmin(letter.X,"MinProminence",0.1);
numXmin = nnz(idxmin)
idxmax = islocalmax(letter.Y,"MinProminence",0.1);
numYmax = nnz(idxmax)
dT = diff(letter.Time);
dXdT = diff(letter.X)./dT;
dYdT = diff(letter.Y)./dT;
avgdX = mean(dXdT,"omitnan")
avgdY = mean(dYdT,"omitnan")
corrXY = corr(letter.X,letter.Y,"rows","complete")

featurenames = ["AspectRatio","NumMinX","NumMinY","AvgU","AvgV","CorrXY"];

預設情況下,用table函式構造的表有預設的變數名。要使表具有更有用的名稱,請使用“VariableNames”選項。

T = table(x,y,z,‘VariableNames’,[“X”,“Y”,“Z”]);

通常可以使用單引號或雙引號來指定選項名。但是,因為字串可以表示表中的資料,所以在指定’VariableNames’選項時需要使用單引號。

feat = table(aratio,numXmin,numYmax,avgdX,avgdY,corrXY,'VariableNames',featurenames)

要自動化特徵提取,需要資料儲存在每次讀取資料時應用提取功能。與預處理一樣,您可以使用轉換後的資料儲存來完成此操作。
在這裡插入圖片描述
對於原始資料,通常需要同時應用預處理和特徵提取功能。您可以重複應用transform()函式來向原始資料儲存新增任意數量的轉換。

%.txt的檔案存一個datastore
letterds = datastore("*.txt");
% 通過函式scale(),把datastore1預處理成另一個datastore2
preprocds = transform(letterds,@scale);
% 通過函式extract(),把datastore2中的特徵值提取成另一個datastore3
featds = transform(preprocds,@extract);

data1 = readall(letterds)
data2 = readall(preprocds)
data3 = readall(featds)
scatter(data3.AspectRatio,data3.CorrXY)

可以使用extractBetween()函式來提取給定字串之間的文字。

% 提取原始datastore中的.Files欄位資料。
knownchar = extractBetween(letterds.Files,"_","_")

在這裡插入圖片描述
對於分類問題,通常希望將已知標籤表示為分類變數。可以使用categorical()函式將陣列轉換為分類型別。

knownchar = categorical(knownchar)

在這裡插入圖片描述
將已知的類與訓練資料關聯起來是很方便的。
使用gscatter()函式製作x軸上的AspectRatio和y軸上的CorrXY的分組散點圖,按字元分組。

data.Character = knownchar
gscatter(data.AspectRatio,data.CorrXY,data.Character)

在這裡插入圖片描述

分類模型

訓練和使用機器學習模型進行預測。

訓練模型

letterdata.mat包含了了2906個字母樣本的特徵資料。有25個特徵,包括統計測量,相關,和最大值/最小值的位置,速度,和壓力的筆。

load letterdata.mat
traindata

histogram(traindata.Character) % 畫一下26個字母的直方圖

在這裡插入圖片描述
線箱圖是視覺化多個分佈的一種簡單方法。
boxplot(x, c)
這建立了一個圖,圖中的方框表示c中每個類的x值的分佈。如果一個類的x值與另一個類的x值顯著不同,那麼x就是一個可以區分這些類的特性。您擁有的能夠區分不同類的特性越多,您就越有可能從完整的資料集構建準確的分類模型。

boxplot(traindata.MADX,traindata.Character)

在這裡插入圖片描述

用分類模型進行預測

load letterdata.mat
traindata
knnmodel = fitcknn(traindata,"Character","NumNeighbors",5,"Standardize",true,"DistanceWeight","squaredinverse");
testdata

predLetter = predict(knnmodel,testdata)
misclassrate = sum(predLetter ~= testdata.Character)/numel(predLetter)

響應類在訓練或測試資料中並不總是平均分佈的。損失是對錯誤分類的更公平的衡量,它包含了每一類的概率(基於資料的分佈)。

testloss = loss(knnmodel,testdata)

您可以計算已知正確類的任何資料集的損失。嘗試確定原始訓練資料(traindata)的丟失情況。這就是所謂的重新替換損失(訓練資料被“重新替換”到模型中的損失)。您可以使用再減損失(knnmodel)直接計算再替換損失。

Investigating Misclassifications(Identifying Common Misclassifications)

根據預測結果和真實結果的關係,可以將機器學習模型的預測分為4類在這裡插入圖片描述
稱這個東西為Confusion矩陣。

investigating Misclassifications(Investigating Features)

相關文章