马季就是迄今为止最后一个跟我合租的人.
该人大学比我早两年, 在日本某学校完成学业; 现在在某日资软件公司做Program manager.
因为公司迁址, 加上房子到期, 这小子就走了.
马季是发音相似, 方便我用拼音输入法.
酒量很好. 据说是高中毕业才被发现具有这个天赋的.
看过他日本读书时候的照片: 瘦猴一个, 但是现在, 从头到脚, 整个一个球形.
马季这厮, 平时吃饭必须啤酒下饭. 下饭的啤酒, 正常也得三五瓶, 就跟我喝凉水一样.
马季有过一次很惨的醉酒, 据扶他回来的小孙说是, 白酒2斤, 黄酒若干, 和啤酒N瓶. 轮流挨个, 不知道加起来喝了多少,
终于摇摇晃晃被扶了回来. 那次是周末.
第二天, 他吐完就拍拍屁股擦擦嘴回杭州的婆家了.
气味熏人.
我拼命忍着呕吐的感觉, 清理了N遍房间, 清水反复冲洗, 还是难以遏制这种凶恶的味道.
后来被我拉下脸说: 以后不许这样! 后来果然没有这样过.
今天请吃饭. 我直接点了3瓶给他.
旁边一帮吃饭的接近80末90后的小师弟和小师妹们叽叽喳喳要吵翻天, 一点点酒就灌得脸通红的那种.
马季是属于闷声不响, 抿抿嘴, 三瓶酒下去了. 东北人就是厉害 这时我碰到的第二个酒量好的东北人.
|
首先, 通过IT在受限帐户的C盘安装开源软件Octave 3.0.2(这个是当前的最新的稳定版);
其次, 编写PLS算法的函数, 我折腾半天, 修改成这个样子:
(由于Ycool显示字符时候自作聪明的一些做法, 文件的路径名的双引号下字符串中看到的 单斜杠, 其实double的, 双斜杠)
function [theta,w,cw,ssqdif,yres] = plsr(xreg,yreg,ninput,lv,plotopt);
[nrx,ncx] = size(xreg);
[nry,ncy] = size(yreg);
if nrx ~= nry
error('Number of rows for input and output must be same!');
return
end
ssqx = sum(sum(xreg.^2)');
ssqy = sum(sum(yreg.^2)');
x = xreg;
y = yreg;
I = eye(ncx);
w = zeros(ncx,lv);
for i = 1:lv
w(:,i) = x'*y;
w(:,i) = w(:,i)/norm(w(:,i));
r(:,i) = x * w(:,i);
x = x - r(:,i) * w(:,i)';
y = y - r*(r\y);
ssq(i,1) = (sum(sum(x.^2)'))*100/ssqx;
ssq(i,2) = (sum(sum(y.^2)'))*100/ssqy;
end
cw = r\yreg;
size(w)
size(cw)
thetam = w * cw;
save("-ascii","d:\octave\coefficient.txt","thetam"); % 这是因为Octave函数传递参数总是出错, 不得已只好保存到文件中;
% 这样以来,其实后面的部分意义不大了; 之所以要放D盘, 因为受限帐户只能读写D盘, 默认居然是安装所在的C
ssqdif = zeros(lv,2);
ssqdif(1,1) = 100 - ssq(1,1);
ssqdif(1,2) = 100 - ssq(1,2);
for i = 2:lv
for j = 1:2
ssqdif(i,j) = -ssq(i,j) + ssq(i-1,j);
end
end
disp(' ')
disp(' Percent Variance Captured by PLS Model')
disp(' ')
disp(' ----X-Block------ ----Y-Block------')
disp(' LV# This LV Total This LV Total ')
disp([(1:lv)' ssqdif(:,1) cumsum(ssqdif(:,1)) ssqdif(:,2) cumsum(ssqdif(:,2))])
ypred = xreg * thetam;
yres = yreg - ypred;
rms = norm(yres);
if plotopt == 1 | plotopt == 2
clf;
if plotopt == 2
else
end
end
n = ncx / ninput;
for i = 1:ninput
theta(:,i) = thetam(n*(i-1)+1:n*i);
end
Endfunction
那么, 有了函数, 如何实现和运行呢?
Octave远远没有Matlab方便.
因为C:不能写, 只能把plsr.m保存在d:\octave 文件夹下面;
运行之前, 先添加搜索路径:
addpath("d:\ocatve");
这样plsr.m才可以调用;
数据如何导入导出呢?
Octave提供的数据IO方式也非常尴尬, 是从类似C语言和Pascal等高级语言模仿来的, 很不方便;
因此, 如果是4000*1000这样的规模的矩阵, 根本无法像Matlab的 xlsread那么方便读入
只能逐行缓慢读入, 并转化成浮点数的矩阵的形式. -- 赶紧保存起来! 因为太不容易了!
做成 .mat的格式, 就可用和Matlab兼容了, 可以用load命令读入内存了;
使用plsr之前, 先要 load一下需要处理的数据: 比如, load PLSPredictor.mat; 文件的后缀也是必须的;
用whos可以查看Octave工作空间内存中变量的情况 --- 远远没有Matlab那么方便: 一看即知道.
然后 调用像在Matlab中调用plsr一样, 调用plsr, 计算出的需要用的系数根据前面修改的部分, 会以ascii码形式保存在
coefficient.txt 文件中, 这样就可以用于PLS预测了.
Octave因为借用了现成的一些免费开源的图形软件, 比如gunplot (这是安装时候的两个选项之一, 也是较为稳定成熟的)
所以, 图形处理功能尽管已经不错, 但是和Matlab中不少功能相比, 差距还是很大. -- 不是一般的大. 所以, 我直接把后半部分
绘制plsr效果评价的图片部分"阉割"掉了.
目的非常明确: 利用Octave有限的, 但是却具备了的计算功能, 实现PLSR的计算; 直奔目标, 拿到需要的系数.
哈哈哈哈哈, 我做到了!
|