Aprendizaje automático de Matlab 3 (Machine Learning Onramp)

Características de ingeniería

Calcular propiedades estadísticas (cuantificar la forma de las letras)

¿Qué estadísticas pueden proporcionar información sobre la forma de las letras? Diferentes letras tienen diferentes distribuciones de puntos.

% 导入数据
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")

Las letras están preprocesadas para tener un valor medio de 0 (en X e Y). La sensibilidad de la mediana a valores atípicos es menor que la media. La comparación de la media y la mediana puede darnos una idea de cuán asimétrica es una distribución.

% 平均绝对偏差(mean absolute deviation, MAD)
devxb = mad(b1.X)	% mad函数自动忽略NaNs
devyb = mad(b1.Y)

El grado de dispersión de los valores se puede medir con la desviación absoluta media, la desviación estándar y la varianza, cada una de las cuales se calcula para desviarse de la media.

Luego, se realizaron cálculos repetidos de propiedades estadísticas en otras muestras de letras. La siguiente figura traza la relación de aspecto y la desviación absoluta media de las Inserte la descripción de la imagen aquí
letras byd para muestras de 8 letras . De hecho, estas características estadísticas pueden reflejar la diferencia en las formas de las letras.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Encontrar pico

Los mínimos y máximos locales suelen ser características importantes de una señal. Las funciones islocalmin e islocalmax pueden realizar la función de encontrar el valor pico.

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

Inserte la descripción de la imagen aquí
El mínimo y el máximo locales se definen calculando la prominencia de cada valor en la señal. El valor sobresaliente es una medida de la comparación entre un valor y otros valores circundantes. Puede obtener el valor destacado de cada punto de la señal obteniendo la segunda salida de islocalmin o islocalmax.

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

Inserte la descripción de la imagen aquí

% 通过参数指定大于多少才是峰值
idxmin = islocalmin(m1.X,"MinProminence",0.1)
idxmax = islocalmax(m1.X,"MinProminence",0.1)

Calcular la derivada

Un aspecto importante de la detección de letras escritas en una tableta es la información útil en el proceso de redacción de cartas. Es decir, la pendiente de la posición horizontal y vertical cambia con el tiempo.
Para puntos de datos discretos, la velocidad estimada se aproxima usando una diferencia finita v = Δx / Δt.

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

La función diff calcula la diferencia entre dos elementos adyacentes. Entonces la salida será un elemento menos que la entrada. Necesito prestar atención al dibujar.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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

Debido a la limitación de la resolución del proceso de recolección de datos, los datos contienen algunos valores repetidos. Si la posición y el tiempo se repiten, entonces la diferencia es 0, luego 0/0 = NaN. Sin embargo, si los valores de posición son ligeramente diferentes, entonces la derivada será Inf (distinto de cero dividido por 0).

Tenga en cuenta que max ignora NaN, pero no Inf, porque Inf es mayor que cualquier valor finito. Sin embargo, para esta aplicación, tanto NaN como Inf pueden ignorarse porque representan datos repetidos. Puede utilizar la función standardizeMissing para convertir una serie de valores en NaN

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

Correlación de cálculo (correlaciones)

Inserte la descripción de la imagen aquí
El par de señales de la izquierda tiene una forma significativamente diferente del par de señales de la derecha. Pero la relación entre los dos conjuntos de señales es similar: en el área azul, la señal superior aumenta, la señal inferior disminuye y el área amarilla es opuesta. La correlación intenta medir esta similitud, independientemente de la forma de la señal.

En la primera mitad de la letra V, la posición horizontal y la posición vertical tienen una fuerte correlación lineal negativa, la posición horizontal aumenta y la posición vertical disminuye proporcionalmente. Del mismo modo, en la segunda mitad, la posición también tiene una fuerte correlación positiva.Cuando la posición horizontal aumenta, la posición vertical también aumenta proporcionalmente.

% corr函数计算变量之间的线性相关。
load sampleletters.mat
plot(v2.X,v2.Y,"o-")
C = corr(v2.X,v2.Y)	% corr函数计算变量之间的线性相关。

Debido a que ambas variables contienen datos faltantes, C es NaN. Puede utilizar la opción "Filas" para especificar cómo evitar valores perdidos.

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

El coeficiente de correlación está siempre entre -1 y +1. Un coeficiente de -1 indica una correlación lineal completamente negativa, un coeficiente de +1 indica una correlación lineal completamente positiva y un coeficiente de 0 indica que no hay correlación lineal. En este caso, solo hay una correlación moderada, porque el cálculo se ha realizado en toda la señal. Puede resultar más útil considerar las dos mitades de la señal por separado.

% 要计算每一对变量之间的相关性,可以向corr函数传递一个矩阵,其中每个变量是矩阵的一列。
M = [v2.X(1:11) v2.Y(1:11) v2.X(12:22) v2.Y(12:22)]
Cmat = corr(M,"Rows","complete")

Extracción de características automatizada

Una vez que haya decidido la extracción de características que desea, debe aplicar los cálculos apropiados al conjunto de datos para cada muestra. El primer paso para automatizar este proceso es tomar los datos de una función de función personalizada como entrada y devolver una matriz como salida.

Actualmente, el script calcula 6 características para una letra determinada (almacenadas en la letra variable). Estas seis características se almacenan en seis variables separadas.
Puede utilizar la función de tabla para combinar variables individuales en una tabla.

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"];

De forma predeterminada, las tablas construidas con la función de tabla tienen nombres de variable predeterminados. Para hacer que las tablas tengan nombres más útiles, use la opción "VariableNames".

T = tabla (x, y, z, 'VariableNames', [“X”, “Y”, “Z”]);

Por lo general, puede utilizar comillas simples o dobles para especificar el nombre de la opción. Sin embargo, debido a que la cadena puede representar los datos de la tabla, se requieren comillas simples al especificar la opción 'VariableNames'.

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

Para automatizar la extracción de características, se requiere el almacenamiento de datos para aplicar la función de extracción cada vez que se leen datos. Al igual que con el preprocesamiento, puede utilizar el almacén de datos convertido para lograr esto.
Inserte la descripción de la imagen aquí
Para los datos brutos, generalmente es necesario aplicar simultáneamente funciones de preprocesamiento y extracción de características. Puede aplicar repetidamente la función transform () para agregar cualquier número de transformaciones al almacén de datos original.

%.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)

Puede utilizar la función extractBetween () para extraer el texto entre una cadena determinada.

% 提取原始datastore中的.Files字段数据。
knownchar = extractBetween(letterds.Files,"_","_")

Inserte la descripción de la imagen aquí
Para problemas de clasificación, generalmente es deseable representar etiquetas conocidas como variables categóricas. Puede utilizar la función categórica () para convertir una matriz en un tipo categórico.

knownchar = categorical(knownchar)

Inserte la descripción de la imagen aquí
Es conveniente asociar clases conocidas con datos de entrenamiento.
Utilice la función gscatter () para hacer un diagrama de dispersión agrupado de AspectRatio en el eje xy CorrXY en el eje y, agrupando por carácter.

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

Inserte la descripción de la imagen aquí

Modelo de clasificación

Entrene y use modelos de aprendizaje automático para hacer predicciones.

Modelo de entrenamiento

letterdata.mat contiene los datos de características de 2906 muestras de letras. Hay 25 funciones, que incluyen medición estadística, correlación y posición máxima / mínima, velocidad y presión del lápiz.

load letterdata.mat
traindata

histogram(traindata.Character) % 画一下26个字母的直方图

Inserte la descripción de la imagen aquí
Los diagramas de caja son una forma sencilla de visualizar múltiples distribuciones.
boxplot (x, c)
Esto crea una gráfica. Las cajas en la gráfica representan la distribución de los valores de x para cada clase en c. Si el valor x de una clase es significativamente diferente del valor x de otra clase, entonces x es una característica que puede distinguir estas clases. Cuantas más características tenga que puedan distinguir diferentes clases, más probabilidades tendrá de construir un modelo de clasificación preciso a partir de un conjunto de datos completo.

boxplot(traindata.MADX,traindata.Character)

Inserte la descripción de la imagen aquí

Usa modelos de clasificación para hacer predicciones

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)

Las clases de respuesta no siempre se distribuyen de manera uniforme en los datos de entrenamiento o prueba. La pérdida es una medida más justa de clasificación errónea e incluye la probabilidad de cada categoría (según la distribución de los datos).

testloss = loss(knnmodel,testdata)

Puede calcular la pérdida para cualquier conjunto de datos de clase correcta conocida. Intente determinar la pérdida de los datos de entrenamiento originales (traindata). Esta es la llamada pérdida de re-reemplazo (la pérdida de los datos de entrenamiento que son "re-reemplazados" en el modelo). Puede usar knnmodel para calcular directamente la pérdida de reemplazo.

Investigación de clasificaciones erróneas (identificación de clasificaciones erróneas comunes)

De acuerdo con la relación entre los resultados predichos y los resultados reales, las predicciones del modelo de aprendizaje automático se pueden dividir en 4 categorías y Inserte la descripción de la imagen aquí
llamar a esto la matriz de confusión.

investigar clasificaciones erróneas (características de investigación)

Supongo que te gusta

Origin blog.csdn.net/Explore_OuO/article/details/108890705
Recomendado
Clasificación