Machine Learning tools inside Matlab.docx

上传人:b****6 文档编号:4279608 上传时间:2022-11-28 格式:DOCX 页数:29 大小:397.62KB
下载 相关 举报
Machine Learning tools inside Matlab.docx_第1页
第1页 / 共29页
Machine Learning tools inside Matlab.docx_第2页
第2页 / 共29页
Machine Learning tools inside Matlab.docx_第3页
第3页 / 共29页
Machine Learning tools inside Matlab.docx_第4页
第4页 / 共29页
Machine Learning tools inside Matlab.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

Machine Learning tools inside Matlab.docx

《Machine Learning tools inside Matlab.docx》由会员分享,可在线阅读,更多相关《Machine Learning tools inside Matlab.docx(29页珍藏版)》请在冰豆网上搜索。

Machine Learning tools inside Matlab.docx

MachineLearningtoolsinsideMatlab

MachineLearningwithMatlab

1概述

Matlab中集成了一套用于统计和机器学习的工具包,即StatisticsandMachinelearningToolbox,极大方便了机器学习开发者的算法研究和原理验证。

该工具包可解决回归、分类和聚类等机器学习问题,并支持多种监督和非监督算法,包括SVM、决策树、KNN、k-means、k-medoids、高斯混合模型、隐藏马尔科夫模型等。

此外,还支持多种选择关键特征的算法,包括PCA、顺序特征选择、逐步回归、正则化等。

下面将结合用户手册,对该工具包的使用进行介绍。

2支持数据类型

该工具包支持多种数据类型作为输入,括号里的是数据类型。

为了方便理解这些数据类型的使用方法,将结合示例程序对其进行说明。

其中,红色部分为代码,绿色部分为输出。

支持的数据类型包括:

Ø具有单精度(single)或双精度(double)的数值标量、向量和矩阵

Ø字符串矩阵(cellstr);字符(char)、逻辑(logical)或类型(categorical)矩阵;类型变量的数值矩阵(single/double)。

典型示例就是类标签。

不推荐使用nominal和ordinal类型,它们可能会在以后的版本删除。

Ø表格(table)是上述数据类型的矩阵形式,用于表示异构数据。

典型示例是混合了类型变量和数值变量的回归分析。

不推荐使用dataset类型,可能会在以后的版本中删除。

如果函数不支持table类型,就采用single或double的矩阵。

ØgpuArray类型可作为函数的输入参数,在GPU中执行。

由于该类型与IDS无关,这里就不做进一步介绍。

有兴趣的话,请查询MatlabHelp。

此外,不支持的数据类型包括:

Ø复数

Ø自定义的数值类型

Ø用于非分组数据的带符号整数

Ø稀疏矩阵

2.1数值single/double

2.1.1基本操作

>a=4;

b=single(4);

class(a)

ans=

double

class(b)

ans=

single

说明:

默认情况下,声明一个数值变量属于double类型,通过single函数可以强制转成single类型,降低所需的存储空间。

single函数的输入可以是任何数值对象,甚至可以是数组。

2.2逻辑logical

2.2.1基本操作

>A=[1-32;547;-813];

M=mod(A,2)

M=

110

101

011

L=logical(mod(A,2))

L=

110

101

011

class(M)

ans=

double

class(L)

ans=

logical

A(M)

error

A(L)

ans=

1

5

-3

1

7

3

说明:

虽然M和L的数值是相同的,但类型不同,M为double类型,L为logical类型。

这也导致了A(L)是有效的,而A(M)是无效的。

2.3字符串矩阵cellstr

2.3.1基本操作

>S=['abc';'def';'ghi'];

C=cellstr(S);

whosS

NameSizeBytesClassAttributes

S3x318char

whosC

NameSizeBytesClassAttributes

C3x1354cell

说明:

cellstr函数可以将矩阵S转换成字符向量的cell矩阵。

其中,S可以是字符串矩阵、类型(categorical)矩阵、日期时间矩阵等。

2.4无大小的类型nominal(不推荐)

2.4.1基本操作:

创建、比较、设置

>loadfisheriris

unique(species)

ans=

'setosa'

'versicolor'

'virginica'

speciesNom=nominal(species);

class(speciesNom)

ans=

nominal

getlevels(speciesNom)

ans=

setosaversicolorvirginica

getlabels(speciesNom)

ans=

'setosa''versicolor''virginica'

>speciesNom2=nominal(species,{'seto','vers','virg'});

getlevels(speciesNom2)

ans=

setoversvirg

getlabels(speciesNom2)

ans=

'seto''vers''virg'

isequal(speciesNom=='setosa',speciesNom2=='seto')

ans=

1

>speciesNom3=setlabels(speciesNom,{'seto','vers','virg'});

getlevels(speciesNom2)

ans=

setoversvirg

getlabels(speciesNom2)

ans=

'seto''vers''virg'

说明:

第一部分是先加载数据集fisheriris,其中变量species是150*1的字符串矩阵,每个条目是一个物种名,共有3个物种。

然后,在无附加参数的情况下调用nominal函数,创建一个新的nominal矩阵,其内容与species一致。

调用getlevels和getlabels函数的返回值都是按照字母表顺序的类标签,但它们的数据类型不同,前者为nominal类型,后者为cell类型(字符串)。

第三部分是有附加参数的情况下调用nominal函数,参数为自定义的标签。

它们与species中的条目是按照出现的先后顺序来对应的,也就是说species第一个出现的类型与第一个标签对应,第二个出现的类型与第二个标签对应,以此类推。

此时,speciesNom2中的所有条目都是species中条目的对应标签,这也可从getlevels和getlabels的返回值得知。

调用isequal函数,可知两个变量是相同的。

第四部分与第三部分类似,但是通过调用setlabels函数来实现的。

该函数会返回一个norminal矩阵,包含与speciesNom相同的内容,但采用了新标签。

2.4.2基本操作:

列表、合并、删除、检索

>loadcarsmall;

Origin=nominal(Origin);

getlevels(Origin)

ans=

FranceGermanyItalyJapanSwedenUSA

tabulate(Origin)

ValueCountPercent

France44.00%

Germany99.00%

Italy11.00%

Japan1515.00%

Sweden22.00%

USA6969.00%

>Origin=mergelevels(Origin,{'France','Germany','Italy','Sweden'},'Europe');

getlevels(Origin)

ans=

EuropeJapanUSA

tabulate(Origin)

ValueCountPercent

Europe1616.00%

Japan1515.00%

USA6969.00%

>Origin2=Origin(Origin~='Italy');

getlevels(Origin2)

ans=

FranceGermanyItalyJapanSwedenUSA

Origin2=droplevels(Origin2,'Italy');

tabulate(Origin2)

ValueCountPercent

France44.04%

Germany99.09%

Japan1515.15%

Sweden22.02%

USA6969.70%

>any(Origin2=='Italy')

ans=

0

any(ismember(Origin2,'Italy'))

ans=

0

ix=find(Origin2=='France')

ix=

11

27

39

61

Origin3=droplevels(Origin,'Italy');

Origin(ix)

ans=

find(isundefined(Origin3))

ix=

11

27

39

61

说明:

该示例程序演示了对类标签的管理,包括合并和删除,它们会涉及到两个函数,即mergelevels和droplevels。

其中,前者只限用于nominal类型,后者可同时用于nominal和oridinal类型。

第一部分为先加载数据集carsmall,并将字符矩阵Origin转化为nominal矩阵的形式。

通过tabulate函数,可以获得不同类标签的数量和占比。

第二部分是利用mergelevels函数,参数2为待合并的类标签,参数3为合并后的类标签。

结果显示,合并后的Origin只有3个类标签。

第三部分是先创建变量Origin2,包括除Italy条目以外的所有Origin条目,但Italy类标签还在。

然后,调用droplevels函数,将Italy的类标签也删除。

如果只调用droplevels函数,系统会警告你在删除一个存在样本的类标签,且原先France对应的标签全变成undefined。

显然,应该先删除样本,再删除类标签。

第四部分是对moninal矩阵的检索和搜索。

利用any函数,可遍历整个矩阵,确认是否满足该条件。

第一条语句就是搜索Origin2矩阵是否包含Italy的类标签。

第二条语句起到相同的作用,但是通过调用ismember函数来实现的。

然后,正如第三部分的说明,演示了对droplevels的错误调用,原属于France的类标签都变成了undefined。

通过isundefined函数,可查询类标签为undefined的样本。

2.5有大小的类型ordinal(不推荐)

ordinal类型与nominal类型的根本区别在于:

前者的类标签是按照字母表顺序(默认)或者自定义顺序进行排序(调用getlabels或getlevels的返回值顺序),可以比较大小;而后者的类标签是相同的顺序,但不能比较大小。

2.5.1基本操作:

创建、比较、排序

>AllSizes={'medium','large','small','small','medium','large','medium','small'};

sizeOrd=ordinal(AllSizes);

getlevels(sizeOrd)

ans=

largemediumsmall

getlabels(sizeOrd)

ans=

'large''medium''small'

sizeOrd

(1)

(2)

ans=

0

>sizeOrd2=ordinal(AllSizes,{},{'xsmall','small','medium','large','xlarge'});

getlevels(sizeOrd2)

ans=

xsmallsmallmediumlargexlarge

getlabels(sizeOrd2)

ans=

'xsmall''small''medium''large''xlarge'

sizeOrd2

(1)

(2)

ans=

1

>sizeOrd3=setlabels(sizeOrd,{'L','M','S'});

getlevels(sizeOrd3)

ans=

LMS

getlabels(sizeOrd3)

ans=

'L''M''S'

sizeOrd3

(1)

(2)

ans=

0

>sizeOrd4=reorderlevels(sizeOrd3,{'S','M','L'});

getlevels(sizeOrd3)

ans=

SML

getlabels(sizeOrd3)

ans=

'S''M''L'

sizeOrd4

(1)

(2)

ans=

1

>sizeOrd5=ordinal(AllSizes,{},{'small','medium','large'});

getlevels(sizeOrd5)

ans=

smallmediumlarge

sizeOrd5=sort(sizeOrd5);

sizeSort(:

ans=

small

small

small

medium

medium

medium

large

large

说明:

第一部分是先定义了变量AllSizes,然后在无附加参数情况下调用ordinal函数。

从getlevels和getlabels函数可以看到,类标签的排序是按照默认的字母表顺序,即large

因此,这也导致sizeOrd

(1)小于sizeOrd

(2),即medium

第二部分是有附加参数情况下调用ordinal函数,参数2为类标签({}),参数3为类级别(自定义的类标签)。

当参数2为{}时,ordinal函数将使用参数3作为类标签,从而简化了函数的调用过程。

而参数3有以下特征:

Ø必须包含Allsizes中所有的类标签,且完全一致,不能简化或修改。

Ø可以出现另外的类标签(xsmall/xlarge),即使它们并没有出现。

Ø指定了类标签的顺序,即xsmall

第三部分与第二部分类似,但是通过调用setlabels函数来实现的。

该函数会返回一个ordinal矩阵,包含与speciesNom相同的内容,但采用了新标签。

需要注意,新标签的顺序应与原标签保持一致,即Large->L,Medium->M,Small->S。

虽然setlabels可以修改类标签,但它们顺序不变,即L

第四部分是通过调用reorderlevels函数,可以强制修改所有类标签的大小,即参数2。

需要注意,参数2必须与参数1中的类标签完全一致,不能增加或修改。

否则,会导致函数调用出错。

另外,nominal类型也可以调用该函数,但只会反映在getlevels和getlabels函数的返回值中,并不能用于大小比较。

这是因为nominal的类标签只有顺序的概念,并没有大小的概念。

第五部分是通过调用sort函数,根据指定的类标签大小,对sizeOrd5中的所有程序进行排序。

2.5.2离散化、统计

>loadhospital;

quantile(hospital.Age,[0,.5,1])

ans=

253950

hospital.AgeCat=ordinal(hospital.Age,{'Under30','30-39','Over40'},[],[25,30,40,50]);

getlevels(hospital.AgeCat)

ans=

Under3030-39Over40

>p=0:

.25:

1;

breaks=quantile(hospital.Weight,p);

ans=

111.0130.5142.5180.5202.0

hospital.WeightQ=ordinal(hospital.Weight,{'Q1','Q2','Q3','Q4'},[],breaks);

getlevels(hospital.WeightQ)

ans=

Q1Q2Q3Q4

>grpstats(hospital,{'AgeCat','WeightQ'},'mean','DataVars','BloodPressure')

ans=

AgeCatWeightQGroupCountmean_BloodPressure

Under30_Q1Under30Q16123.1779.667

Under30_Q2Under30Q23120.3379.667

Under30_Q3Under30Q32127.586.5

Under30_Q4Under30Q4412278

30-39_Q130-39Q112121.7581.75

30-39_Q230-39Q29119.5682.556

30-39_Q330-39Q3912183.222

30-39_Q430-39Q411125.5587.273

Over40_Q1Over40Q17122.1484.714

Over40_Q2Over40Q213123.3879.385

Over40_Q3Over40Q314123.0784.643

Over40_Q4Over40Q410124.685.1

说明:

上述代码是利用ordinal函数,将连续的数值矩阵转换成离散的类型矩阵。

实际情况中,会有需要连续的数值矩阵,故该功能是非常实用的。

第一部分是加载数据集hospital。

它包含了dataset类型的变量hospital,7个成员分别为LastName(Cell)、Sex(Nominal)、Age(double)、Weight(double)、Smoker(logical)、BloodPressure(double)、Trails(cell)。

然后,调用ordinal函数,将数值型的Age转换为类型的AgeCat。

其中,参数2为自定义的标签,参数3为空,参数4为对数值分类的边界值。

这样,25-30岁的类标签是“Under30”,30-40岁的类标签是“30-39”,40-50岁的类标签是“Over40”。

第二部分与第一部分类似,不过是对体重进行分类。

第三部分是调用grpstats函数,输出hospital中的一些统计量。

其中,参数1为数据源;参数2为待分组的变量名,即AgeCat和WeightQ,它们的所有组合将出现在返回值的第一列,而它们各自的值以及组合对应的数量将出现在后续的列中;参数3为统计类型,可以是mean(平均值)、sem(平均值的标准误差)、numel(非NaN的数量)、gname(组名)、std(标准偏差)、var(方差)、min(最小值)、max(最大值)、range(范围)、meanci(平均值的95%置信区间)和predci(新样本的95%预测区间);参数4是另外选项的名称,可以是Alpha(参数3为meanci或predci时,表示置信区间或预测区间)、DataVars(待计算统计量的变量名)、VarNames(指定第一行的名称);参数5为参数4中指定选项的值。

注意,参数4和参数5作为组合,可以出现多次。

2.6类型categorical(推荐)

nominal和ordinal类型,可以合称为categorical类型。

也就说,categorical矩阵可能是有大小,或无大小的。

通过nominal或ordinal函数,将categorical矩阵转为nominal或ordinal类型,反之亦然。

它们还是有一些区别,比如categorical矩阵无法使用getlabels和getlevels函数。

另外,nominal和ordinal类型可能在未来的版本中会被删除,因此还是推荐使用categorical类型。

2.6.1示例代码

>A={'r''b''g';'g''r''b';'b''r''g'};

B=categorical(A)

B=

rbg

grb

brg

class(A)

ans=

cell

class(B)

ans=

categorical

categories(B)

ans=

'b'

'g'

'r'

说明:

通过categorical函数,可将字符串矩阵A转换为categorical矩阵B,两者内容保持一致。

调用categories函数,就能以字母顺序显示B中的唯一类型值。

2.7数据集dataset(不推荐)

2.7.1数值数据集

>loadfisheriris

ds=mat2dataset(meas);

class(ds)

ans=

dataset

ds.Properties

ans=

Description:

''

VarDescription:

{}

Units:

{}

DimNames:

{'Observations''Variables'}

UserData:

[]

ObsNames:

{}

VarNames:

{'meas1''meas2''meas3''meas4'}

ds(1,:

ans=

meas1meas2meas3meas4

5.13.51.40.2

ds.Properties.Description='Fisheririsdata';

ds.Properties.VarNames={'SLength','SWidth','PLength','PWidth'};

ds(1,:

ans=

SLengthSWidthPLengthPWidth

5.13.51.40.2

>ds2=mat2dataset(meas,'VarNames',{'myVar1','myVar2','myVar3','myVar4'});

ds2(1,:

ans=

myVar1myVar2myVar3myVar4

5.13.51.40.2

>ds.Species=nominal(species);

ds(1,:

ans=

SLengthSWidthPLengthPWidthSpecies

5.13.51.40.2setosa

说明:

第一部分是通过调用mat2dataset函数,将数值矩阵转换为dataset类型。

该类型具有Properties属性,包括Description(dataset的描述)、VarDescription(变量的描述)、Units(变量的单位)、DimN

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1