【学习笔记】MatLab官网课程学习记录。
1 流程
导入数据-》组织和预处理数据-》特征工程-》构建模型-》评估模型-》部署模型
2 分类工作流
如图所示,文件中存储了字母手写数据,以表格形式组织。
2.1 导入数据
2.1.1 readtable函数
data = readtable("J.txt");
(帮助文档) T = readtable(filename) 通过从文件中读取列向数据来创建表。 readtable 基于文件的扩展名确定文件格式: .txt、.dat 或 .csv(适用于带分隔符的文本文件) .xls(适用于电子表格文件)
readtable 为该文件中的每列在 T 中创建一个变量并从文件的第一行中读取变量名称。它可以检测数据类型,丢弃多余的标题行,并填充缺失值。对于数值变量,用 NaN 值;对于文本,用空字符向量。 文本文件分隔符可以是逗号或者空格。
? 基于文本文件创建格式表:T = readtable(filename,'Format','%s%s%u%f%f%s')。前两列导入为字符向量,将第三列导入为 uint32,将接下来的两列导入为双精度浮点数。将最后一列的条目导入为字符向量。
? 从电子表格中读取特定范围的数据:T = readtable('patients.xls', 'Range','C2:E6', 'ReadVariableNames',false)。使用电子表格 patients.xls 的指定区域中的数据创建表。使用 C2 和 E6 两个对角之间的 5×3 矩形区域内的数据。不要将该区域的第一行用作变量名称。
2.1.2 引用表中变量
x = data.X t = data.Time
2.1.3 坐标控制
默认
?
?
axis equal 纵、横采用等长刻度,单位长度相同
axis square 产生正方形坐标系
?
axis off取消轴背景
2.2 处理数据
2.1.2中给出了引用变量的方法,变量是向量数组,和其他向量数组操作一样。 data.X = data.X + 3; 向量每个数组都加一个标量值。
2.3 抽取特征-计算特征
aratio = range(letter.Y)/range(letter.X) ange(x) 等于 max(x) - min(x)。aspect ratio是纵横比或者高宽比。
还可以计算手写字母的持续时间,作为另外的特征。
2.4 抽取特征-观察特征
2.4.1 scatter
以下代码用散点图观察抽取出的特征,用宽高比做x轴,手写时间做y轴。 load featuredata.mat features scatter(features.AspectRatio,features.Duration)
features
?
2.4.2 gscatter
gscatter是grouped scatter plot,可以通过分组变量对点进行着色区分,函数第三个变量用来设置分组变量,比如下边代码,用Character分组。 gscatter(features.AspectRatio, features.Duration, features.Character)
?
2.5 构建模型
2.5.1 KNN的调用fitcnn函数
? k近邻算法不用多说。fitcnn调用格式:mdl = fitcknn(data,"ResponseVariable"); ? 输出是训练好的模型,第二个输出是response变量,即设置模型预测的类别。举例如下: ? knnmodel = fitcknn(features,"Character")
2.5.2 predict预测结果
predClass = predict(model,newdata) newdata是要预测的样本,可以是向量数组,也可以是矩阵数组;predClass是类别数组。举例如下: predicted = predict(knnmodel,[4,1.2]) 输出是: predicted =? ? V predicted = predict(knnmodel,[4,1.2; 5,2]) 输出是: predicted =? ? V ? J
2.5.3 属性设置
mdl = fitcknn(data, "ResponseVariable", "NumNeighbors", 5); 5是邻居数。
2.6 评估模型
2.6.1 通过测试数据预测结果
predictions = predict(knnmodel,testdata),输入testdata可以是一个数据表,predict自动忽略掉Character列。
2.6.2计算结果是否准确
iscorrect = predictions == testdata.Character
2.6.3计算准确度
accuracy = sum(iscorrect)/numel(predictions)
2.6.4计算混淆矩阵
confusionchart(testdata.Character,predictions);
3 导入和预处理数据
3.1 数据存储
????????datastore 函数用于创建数据存储。数据存储是一个存储库,用于收集由于体积太大而无法载入内存的数据。利用数据存储,可将在磁盘、远程位置或数据库中存储的多个文件中的数据作为单个实体来读取和处理。如果数据太大而无法载入内存,您可以对数据的增量导入进行管理,创建 tall 数组来处理数据,或者使用数据存储作为 mapreduce 的输入以便进一步处理。
任务一:创建数据存储
letterds = datastore("*_M_*.txt")
任务二:从数据存储中读第一个文件
data = read(letterds)
任务三:根据读的table,画图 plot(data.X,data.Y)
?
3.2 变换
? Use the transform function to create a transformed datastore called preprocds. This datastore should apply the scale function to the data referenced by letterds.
letterds = datastore("*_M_*.txt");
data = read(letterds);
data = scale(data);
plot(data.X,data.Y)
preprocds = transform(letterds,@scale)
function data = scale(data)
data.Time = (data.Time - data.Time(1))/1000;
data.X = 1.5*data.X;
data.X = data.X - mean(data.X);
data.Y = data.Y - mean(data.Y);
data.X = data.X - mean(data.X,"omitnan");
data.Y = data.Y - mean(data.Y,"omitnan");
end
4 特征工程
4.1 统计函数
集中趋势度量 mean计算均值 meadian数组的中位数值 mode出现次数最多的值,多个返回其中的最小值 trimmean移除外边界后的均值 geomean 几何平均值
散布的测量 range,范围,最大值-最小值 std,标准偏差 var,方差(变化幅度)
形状度量 skewness,偏度,衡量对称性。 对于正太分布,偏度为0; 若偏度为正,则x均值左侧的离散度比右侧弱,偏度左移; 若偏度为负,则x均值左侧的离散度比右侧强,偏度右移。 kurtosis,峰度:用于度量x偏离某分布的程度。 正太分布的峰度是3; 当时间序列的曲线峰值比正太分布的高时,峰度大于3; 当比正太分布的低时,峰度小于3。 峰度(peakedness;kurtosis)又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度。样本的峰度是和正态分布相比较而言统计量,如果峰度大于三,峰的形状比较尖,比正态分布峰要陡峭。反之亦然。
4.2 找到峰
局部最小值和最大值是信号的重要特征,islocalmin、islocalmax可以求极小值、极大值。 语法:idx = islocalmin(x); 返回的是逻辑数组。 idx = islocalmin(x,"MinProminence",threshvalue) 返回最突出的极小值,参数设置了islocalmin仅返回相对高差至少等于指定值的局部最小值。 局部最小值(波谷)的相对高差,取这两个波峰的较小值,测量从该波峰到波谷的垂直距离。此距离就是相对高差。 局部最大值(波峰)的相对高差,取这两个波谷的较大值,测量从该波谷到波峰的垂直距离。此距离就是相对高差。
4.3计算导数Derivative
y = diff(x)
then y1=x2?x1, y2=x3?x2
计算近似导数: dX = diff(m2.X); dT = diff(m2.Time); dXdT = dX./dT;
standardizeMissing函数,插入标准缺失值 standardizeMissing(x, 0)可以将0替换为NaN
B = standardizeMissing(A,indicator) 将数组或表中由 indicator 指定的值替换为标准缺失值。 标准缺失值取决于数据类型: double、single、duration 和 calendarDuration 的指示符为 NaN datetime 的指示符为 NaT string 的指示符为 <missing> categorical 的指示符为 <undefined> char 的指示符为 ' ' 字符数组的 cell 的指示符为 {''}
4.4计算相关度
手写字母V,前一半纵坐标与横坐标明显负相关,后一半纵坐标与横坐标明显正相关。函数corr可以计算变量之间的线性相关。 C = corr(x,y); C = corr(v2.X,v2.Y,"Rows","complete") 两个变量的相关度 Cmat = corr(M,"Rows","complete") 矩阵中4个变量,得到4*4的相关矩阵
coefficient系数 A coefficient of -1 indicates a perfect negative linear correlation A coefficient of +1 indicates a perfect positive linear correlation A coefficient of 0 indicates no linear correlation
4.5自动特征抽取-抽取函数
load sampleletters.mat letter = b1;
featB1= extract(b1)
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
feat结果
4.6自动特征抽取-从多个数据文件
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) 创建类别数组
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
5 分类模型
5.1 histgram boxplot
5.2预测
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)
5.3调查误分类
confusionchart(testdata.Character,predLetter,"RowSummary","row-normalized");
parallelcoords(data,"Group",classes)
原文链接:https://blog.csdn.net/yq_forever/article/details/85264836 ? 平行坐标图,用来做特征选择的一个方法。主要解决了在多维(大于三维)情况下数据特征无法可视化的问题。 ? 图种每个竖线代表一个特征,上面的点代表该特征的值,每个样本表示出来就是一个贯穿所有竖线的折线图。 ? 一般来说,用不同的颜色代表不同的类别,这样可以方便的看出不同特征对分类的影响。 ? 有以下两个原则; ? 主要看相同颜色的折线是否集中,若在某个属性上相同颜色折线较为集中,不同颜色有一定的间距,则说明该属性对于预测标签类别有较大的帮助. ? 若某个属性上线条混乱,颜色混杂,则较大可能该属性对于标签类别判定没有价值.
?
|