机器学习--手写英文字母3--工程特点

目录

 

统计函数

1.量化字母形状

2.寻找高峰

3.计算导数

4.测量相似性

5.自定义预处理函数

6.转换数据存储


统计函数

Measures of Central Tendency

FunctionDescription
meanArithmetic mean
medianMedian (middle) value
modeMost frequent value
trimmeanTrimmed mean (mean, excluding outliers)
geomeanGeometric mean
harmeanHarmonic mean

Measures of Spread

FunctionDescription
rangeRange of values (largest – smallest)
stdStandard deviation
varVariance
madMean absolute deviation
iqrInterquartile range (75th percentile minus 25th percentile)

Measures of Shape

FunctionDescription
skewnessSkewness (third central moment)
kurtosisKurtosis (fourth central moment)
momentCentral moment of arbitrary order

1.量化字母形状

描述性统计笔迹样本在水平和垂直位置的平均值均为零。还有什么其他的统计数据可以提供字母形状的信息?不同的字母有不同的点数分布。描述这些分布形状的统计度量可能是有用的特征。

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

aratiob = range(b1.Y)/range(b1.X)

字母经过预处理后的平均值为0(X和Y)。中位数对异常值的敏感性低于平均值。将平均数与中位数进行比较可以了解分布的不对称程度。

使用中值函数计算b1.X和b1.Y的中值。将结果分别存储在名为medxb和medyb的变量中。记住使用“omitnan”标志。

medxb = median(b1.X,"omitnan")
medyb = median(b1.Y,"omitnan")

可以使用平均绝对偏差(MAD)、标准偏差和方差来测量值的分布。每一个都计算出某个测量值偏离平均值的平均值。

使用mad函数计算b1.X和b1.Y的平均绝对偏差。将结果分别存储在名为devxb和devyb的变量中。注意mad默认忽略NaNs。

devxb = mad(b1.X)
devyb = mad(b1.Y)

对于其他一些示例字母,计算相同的统计信息:

v1的纵横比,存储在aratiov中

d1.X的中值,存储在medxd中

d1.Y的中值,存储在medyd中

m1.X的平均绝对偏差,存储在devxm中

m1.Y的平均绝对偏差,存储在devym中

aratiov = range(v1.Y)/range(v1.X)
medxd = median(d1.X,"omitnan")
medyd = median(d1.Y,"omitnan")
devxm = mad(m1.X)
devym = mad(m1.Y)

2.寻找高峰

局部极小值和极大值通常是信号的重要特征。islocalmin和islocalmax函数以一个信号作为输入,并返回一个与信号长度相同的逻辑数组。

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)

By default, islocalmin and islocalmax find points with any prominence value above 0. This means that a maximum is defined as any point that is larger than the two values on either side of it. For noisy signals you might want to consider only minima and maxima that have a prominence value above a given threshold.

idxmin = islocalmin(m1.X,"MinProminence",0.1)
idxmax = islocalmax(m1.X,"MinProminence",0.1)

3.计算导数

load sampleletters.mat
plot(m2.Time,m2.X)
grid

dX = diff(m2.X);
dT = diff(m2.Time);

dXdT = dX./dT;
plot(m2.Time(1:end-1),dXdT)

由于数据收集过程的分辨率受到限制,数据包含一些重复值。如果位置和时间都重复,则差异都为0,从而产生0/0=NaN的导数。但是,如果位置值相差很小,则导数为Inf(非零除以0)。
注意,max忽略NaN而不忽略Inf,因为Inf大于任何有限值。但是,对于这个应用程序,NaN和Inf都可以忽略,因为它们表示重复的数据。
可以使用standardizeMissing函数将一组值转换为NaN(或非数值数据类型的适当缺失值)。

maxdx = max(dXdT)
dYdT = diff(m2.Y)./dT;
maxdy = max(dYdT)

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

4.测量相似性

左边的一对信号与右边的一对信号有着明显不同的形状。然而,在这两种情况下,每对信号中的两个信号之间的关系是相似的:在蓝色区域中,上信号增大而下信号减小,在黄色区域则相反。相关性试图测量这种相似性,而不管信号的形状如何。

对于字母V的前半部分,水平位置和垂直位置有很强的负线性相关:当水平位置增大时,垂直位置成比例减小。同样,对于下半场,位置也有很强的正相关:当水平位置增加时,垂直位置也成比例增加。

corr函数计算变量之间的线性相关性。

load sampleletters.mat
plot(v2.X,v2.Y,"o-")

C = corr(v2.X,v2.Y)

因为这两个变量都包含丢失的数据,所以C是NaN。可以使用“Rows”选项指定如何避免丢失值。
C=corr(x,y,“Rows”,“complete”);

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

相关系数始终在-1和+1之间。
系数-1表示完全负线性相关
系数+1表示完全正线性相关
系数为0表示没有线性相关性
在这种情况下,只有中等的相关性,因为已经对整个信号执行了计算。单独考虑信号的两半可能更具信息性。

要计算多个变量的每对之间的相关性,可以将矩阵传递给corr函数,其中每个变量是矩阵的一列。
M=[x y z];
C=corr(M);

M = [v2.X(1:11) v2.Y(1:11) v2.X(12:22) v2.Y(12:22)]

Cmat = corr(M,"Rows","complete")

输出Cmat是M列的每个成对组合之间的相关系数的4乘4矩阵,即Cmat(j,k)是M(:,j)和M(:,k)的相关。矩阵是对称的,因为x和y之间的相关性与y和x之间的相关性相同。对角线元素总是等于1,因为变量总是与自身完全相关。

5.自定义预处理函数

一旦确定了要提取的特征,就需要对数据集中的每个样本应用适当的计算。自动化此过程的第一步是创建一个自定义函数,该函数将数据作为输入,并返回一个特性数组作为输出。

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函数将单独的变量组合到一个表中。

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

默认情况下,使用table函数构造的表具有默认变量名。若要生成具有更有用名称的表,请使用“VariableNames”选项。
T=table(x,y,z,'VariableNames',[“x”,“y”,“z”]);
通常可以使用单引号或双引号指定选项名称。但是,由于字符串可以表示表的数据,因此在指定“VariableNames”选项时需要使用单引号。

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


在脚本的末尾,添加一个名为extract的本地函数,该函数接受单个变量letter作为输入,并返回一个feat表作为输出。从脚本的开头和任务2复制代码以生成函数体。用b2作为输入调用函数来测试函数。将结果存储在名为featB2的变量中。

featB2 = extract(b2)

function feat = extract(letter)
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"];
feat = table(aratio,numXmin,numYmax,avgdX,avgdY,corrXY,'VariableNames',featurenames);
end

6.转换数据存储

要自动提取特征,需要数据存储在读取数据时应用提取功能。与预处理一样,可以使用转换后的数据存储来执行此操作。

从原始数据中,通常需要应用预处理和特征提取功能。可以重复应用transform函数,将任意数量的转换添加到原始数据的数据存储中。
脚本当前将scale函数应用于数据存储字母中的文件。转换后的数据存储存储在变量predocd中。

使用transform函数将extract函数应用于数据存储预处理。将结果存储在名为featds的变量中。

使用read all函数从所有数据文件中读取、预处理和提取特征。将结果存储在名为data的变量中。
有12个文件,extract函数为每个文件计算6个特征。因此,数据应该是12乘6表。
通过在x轴上建立一个散点图,在y轴上绘制一个散点图来可视化导入的数据。

使用extractBetween函数,通过查找两个下划线字符(u)之间的文本,从文件名中获取已知的字母名。将结果存储在名为knownchar的变量中。回想一下,文件名存储在数据存储区letterds的Files属性中。

对于分类问题,通常需要将已知标签表示为分类变量。可以使用categorical函数将数组转换为categorical类型。
xcat = categorical(x)
默认情况下,x中的唯一值将用于定义类别集。

将已知类与训练数据相关联是很方便的。回想一下,您可以通过使用点表示法为变量赋值来在表中创建新变量。

T.newvar = workspacevar

letterds = datastore("*.txt");
preprocds = transform(letterds,@scale)

featds = transform(preprocds,@extract)

data = readall(featds)
scatter(data.AspectRatio,data.CorrXY)

knownchar = extractBetween(letterds.Files,"_","_")

knownchar = categorical(knownchar)

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


function data = scale(data)
% Normalize time [0 1]
data.Time = (data.Time - data.Time(1))/(data.Time(end) - data.Time(1));
% Fix aspect ratio
data.X = 1.5*data.X;
% Center X & Y at (0,0)
data.X = data.X - mean(data.X,"omitnan");
data.Y = data.Y - mean(data.Y,"omitnan");
% Scale to have bounding box area = 1
scl = 1/sqrt(range(data.X)*range(data.Y));
data.X = scl*data.X;
data.Y = scl*data.Y;
end

function feat = extract(letter)
% Aspect ratio
aratio = range(letter.Y)/range(letter.X);
% Local max/mins
idxmin = islocalmin(letter.X,"MinProminence",0.1);
numXmin = nnz(idxmin);
idxmax = islocalmax(letter.Y,"MinProminence",0.1);
numYmax = nnz(idxmax);
% Velocity
dT = diff(letter.Time);
dXdT = diff(letter.X)./dT;
dYdT = diff(letter.Y)./dT;
avgdX = mean(dXdT,"omitnan");
avgdY = mean(dYdT,"omitnan");
% Correlation
corrXY = corr(letter.X,letter.Y,"rows","complete");
% Put it all together into a table
featurenames = ["AspectRatio","NumMinX","NumMinY","AvgU","AvgV","CorrXY"];
feat = table(aratio,numXmin,numYmax,avgdX,avgdY,corrXY,'VariableNames',featurenames);
end

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值