📄 matlab6.htm
字号:
<html>
<head>
<title>学用MatLab</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!--
body { font-family: "宋体"; font-size: 9pt; text-decoration: none}
h2 { font-family: "楷体_GB2312"; font-size: 18pt; text-decoration: underline; color: #FF9999}
h1 { font-family: "隶书"; font-size: 24pt; font-style: italic; font-weight: bolder; color: #CC66CC; text-decoration: blink}
.explain { border-color: black black #00FF00; font-weight: bold; color: #333333}
.code { font-family: "Arial", "Helvetica", "sans-serif"; font-size: 12pt; background-color: #FFFFFF; line-height: 24pt}
h3 { font-size: 12pt; font-style: italic; font-weight: bold; color: #9999FF}
-->
</style>
<script language="JavaScript">
<!--
function MM_popupMsg(msg) { //v1.0
alert(msg);
}
//-->
</script>
</head>
<body bgcolor="#CCFFCC" text="#666600" link="#009900" alink="#00FF00" vlink="#006600">
<h1 align="center">数据分析和统计</h1>
<h2>面向列的数据集 </h2>
<p> 这年头似乎十分风行”面向”这个词,这儿故也套用,其英文为"Column-Oriented Data Sets",可理解为MatLab按列的存储方式来分析数据,下面是一个例子:
</p>
<p>Time Location 1 Location 2 Location 3 <br>
01h00 11 11 9 <br>
02h00 7 13 11 <br>
03h00 14 17 20 <br>
04h00 11 13 9 <br>
05h00 43 51 69 <br>
06h00 38 46 76 <br>
07h00 61 132 186 <br>
08h00 75 135 180 <br>
09h00 38 88 115 <br>
10h00 28 36 55 <br>
11h00 12 12 14 <br>
12h00 18 27 30 <br>
13h00 18 19 29 <br>
14h00 17 15 18 <br>
15h00 19 36 48 <br>
16h00 32 47 10 <br>
17h00 42 65 92 <br>
18h00 57 66 151 <br>
19h00 44 55 90 <br>
20h00 114 145 257 <br>
21h00 35 58 68 <br>
22h00 11 12 15 <br>
23h00 13 9 15 <br>
24h00 10 9 7 </p>
<p>以上数据被保存在一个称为count.dat的文件中.</p>
<p>11 11 9 <br>
7 13 11 <br>
14 17 20 <br>
11 13 9 <br>
43 51 69 <br>
38 46 76 <br>
61 132 186 <br>
75 135 180 <br>
38 88 115 <br>
28 36 55 <br>
12 12 14 <br>
18 27 30 <br>
18 19 29 <br>
17 15 18 <br>
19 36 48 <br>
32 47 10 <br>
42 65 92 <br>
57 66 151 <br>
44 55 90 <br>
114 145 257 <br>
35 58 68 <br>
11 12 15 <br>
13 9 15 <br>
10 9 7</p>
<p>下面,我们调入此文件,并看看文件的一些参数</p>
<p class="code">load count.dat<br>
[n,p] = size(count) <br>
n = <br>
24 <br>
p = <br>
3 </p>
<p>创建一个时间轴后,我们可以把图画出来:</p>
<p class="code">t = 1:n;<br>
set(0,'defaultaxeslinestyleorder’,’-|--|-.’) <br>
set(0,'defaultaxescolororder’,[0 0 0]) <br>
plot(t,count), legend('Location 1','Location 2','Location 3',0) <br>
xlabel('Time'), ylabel('Vehicle Count'), grid on </p>
<p><img src="image/data1.jpg" width="679" height="487"></p>
<p>足以证明,<span class="explain">以上是对3个对象的24次观测</span>.</p>
<h2 align="left">基本数据分析函数</h2>
<p class="explain">(一定注意是面向列的) </p>
<p>继续用上面的数据,其每列最大值.均值.及偏差分别为:</p>
<p class="code">mx = max(count) <br>
mu = mean(count) <br>
sigma = std(count) <br>
mx = <br>
114 145 257 <br>
mu = <br>
32.0000 46.5417 65.5833 <br>
sigma = <br>
25.3703 41.4057 68.0281</p>
<p>重载函数,还可以定位出最大.最小值的位置</p>
<p class="code">[mx,indx] = min(count) <br>
mx = <br>
7 9 7 <br>
indx = <br>
2 23 24</p>
<p>试试看,你能看懂下面的命令是干什么的吗?</p>
<p class="code">[n,p] = size(count) <br>
e = ones(n,1) <br>
x = count – e*mu</p>
<p><a href="javascript:void(null)" onClick="MM_popupMsg('这是把该矩阵的每个元素减去其所在列的均值')">点这</a>看看答案!</p>
<p>下面这句命令则找出了整个矩阵的最小值:</p>
<p class="code">min(count(:))<br>
ans = <br>
7 </p>
<h3>协方差及相关系数</h3>
<p>下面,我们来看看第一列的方差:</p>
<p class="code">cov(count(:,1)) <br>
ans = <br>
643.6522</p>
<p>cov()函数作用于矩阵,则会计算其协方差矩阵.</p>
<p>corrcoef()用于计算相关系数,如:</p>
<p class="code">corrcoef(count)<br>
ans = <br>
1.0000 0.9331 0.9599 <br>
0.9331 1.0000 0.9553 <br>
0.9599 0.9553 1.0000 </p>
<h2>数据的预处理</h2>
<h3>未知数据</h3>
<p>NaN(Not a Number--不是一个数)被定义为未经定义的算式的结果,如 0/0.在处理数据中,NaN常用来表示未知数据或未能获得的数据.所有与NaN有关的运算其结果都是NaN.</p>
<p class="code">a = magic(3); <br>
a(2,2) = NaN <br>
a = <br>
8 1 6 <br>
3 NaN 7 <br>
4 9 2<br>
sum(a) <br>
ans = <br>
15 NaN 15 </p>
<p>在做统计时,常需要将NaN转化为可计算的数字或去掉,以下是几种方法:<br>
<span class="explain">注:判断一个值是否为NaN,只能用 isnan(),而不可用 x==NaN</span>; </p>
<table width="75%" border="1" height="143" bordercolorlight="#CCFF66" bordercolordark="#66FF00">
<tr>
<td height="46" width="38%">i = find( ~ isnan(x));<br>
x = x(i) </td>
<td height="46" width="62%">先找出值不是NaN的项的下标,将这些元素保留</td>
</tr>
<tr>
<td width="38%">x = x(find( ~ isnan(x)))</td>
<td width="62%">同上,去掉NaN</td>
</tr>
<tr>
<td width="38%">x = x( ~ isnan(x));</td>
<td width="62%">更快的做法</td>
</tr>
<tr>
<td width="38%">x(isnan(x)) = [];</td>
<td width="62%">消掉NaN</td>
</tr>
<tr>
<td width="38%">X(any(isnan(X)’),:) = [];</td>
<td width="62%">把含有NaN的行都去掉</td>
</tr>
</table>
<p>用此法可以从数据中去掉不相关的数据,看看下面的命令是干什么用的:</p>
<p class="code">mu = mean(count); <br>
sigma = std(count);<br>
[n,p] = size(count) <br>
outliers = abs(count — mu(ones(n, 1),:)) > 3*sigma(ones(n, 1),:); <br>
nout = sum(outliers) <br>
nout = <br>
1 0 0 <br>
count(any(outliers'),:) = [];</p>
<p><a href="javascript:void(null)" onClick="MM_popupMsg('找出数据集中 数据值偏离均值 比 该数据所在列的偏差 要大三倍的数据,并将含有此数据的那次观测值去掉!')">点这</a>看看答案
</p>
<h2>回归与曲线拟合</h2>
<p> 我们经常需要把观测到的数据表达为函数,假如有如下的对时间的观测:</p>
<p class="code">t = [0 .3 .8 1.1 1.6 2.3]’; <br>
y = [0.5 0.82 1.14 1.25 1.35 1.40]’; <br>
plot(t,y,’o’), <br>
grid on</p>
<p><img src="image/data2.jpg" width="423" height="375"></p>
<h3>多项式回归</h3>
<p>由图可以看出应该可以用多项式来表达:y=a0+a1*t+a2*t^2<br>
系数a0,a1,a2可以由最小平方拟合来确定,这一步可由反除号"\"来完成<br>
解下面的三元方程组可得: </p>
<p class="code">X = [ones(size(t)) t t.^2] <br>
X = <br>
1.0000 0 0 <br>
1.0000 0.3000 0.0900 <br>
1.0000 0.8000 0.6400 <br>
1.0000 1.1000 1.2100 <br>
1.0000 1.6000 2.5600 <br>
1.0000 2.3000 5.2900 <br>
a = X\y <br>
a = <br>
0.5318 0.9191 –0.2387 </p>
<p>a即为待求的系数,画图比较可得</p>
<p class="code">T = (0:0.1:2.5)’; <br>
Y = [ones(size(T)) T T.^2]*a; <br>
plot(T,Y,'–',t,y,'o',), grid on</p>
<p><img src="image/data3.jpg" width="503" height="369"></p>
<p>结果令人失望,但我们可以增加阶数来提高精确度,但更明智的选择是用别的方法.</p>
<h3>线性参数回归</h3>
<p>形如:y=a0+a1*exp(-t)+a2*t*exp(-t)<br>
计算方法同上:</p>
<p class="code">X = [ones(size(t)) exp(– t) t.*exp(– t)]; <br>
a = X\y <br>
a = <br>
1.3974 – 0.8988 0.4097 <br>
T = (0:0.1:2.5)'; <br>
Y = [ones(size(T)) exp(– T) T.exp(– T)]*a; <br>
plot(T,Y,'–',t,y,'o'), grid on </p>
<p><img src="image/data4.jpg" width="494" height="375"></p>
<p>看起来是不是好多了!</p>
<h2>例子研究:曲线拟合</h2>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -