先看这个结构
里面的这些函数都是干什么用的戚漏逗,prob,概率。[1:keep],这里应该能大概看出来keep是整数,1:keep等价于1:1:keep,比如1:10,就是1,2,3,4,5,6,7,8,9,10。步长为1,从1到keep.右上角的',这个符号,表示转置,比如1:10,是一个1行10列的
矩阵,通过转置变成10行一列。其中,sum([1:keep]),表示对这个矩阵(从1到keep求和),但是这个语句prob=flipud([1:keep]'/sum([1:keep]))里面总高卖觉得缺少了一个.。prob=flipud([1:keep]'./sum([1:keep]))这样看来应该才能运行,我没尝试,在commandwindow里面直接做是可以的,但是在脚本文件里面做,可能会报错。这个和矩阵运算有关,暂且放在这里。
然后到外部,这样我们知道了在第一行flipud()函数体里面,实际上是在用1到keep的每一个数搜举,除以1到keep的和值,得到一个长度为keep的矩阵。值得注意的是,这个矩阵的和值为1,在下面会用到这一点。然后flipud()函数的作用,是把矩阵倒置,比如[1,3,4,5],使用flipud()之后变成[5,4,3,1]。注意,这个 *** 作和sort()函数不同,这个只是把以前的顺序倒置,并不排序。从这里大概可以看出来,其实这个keep的值,等于chromosomes,染色体数量。这样,对于不同的染色体,配对概率就不一样了。从这里可以看出来,染色体配对概率应该是第一条最高,然后依次递减。然后计算或然率,cumsum(),进行累加求和,比如matlab中给出的例子,我们用[1,2,3]也可以写作1:3,来说,cumsum之后的结果是[1,3,6],也就是从第一个开始加和,一直加到这一项。这一点,非常类似高斯函数积分的感觉。用来计算概率cumulativedistribution。然后odd变量,把0加在了cumsum结果的前面,比如刚刚的例子[0cumsum([1,2,3])],就变成了[0,1,3,6]。注意这个地方他又转置了一次,因为在第一行计算prob的时候,他把一个行向量,转换成了列向量,然后现在要把0加在头上,所以在进行cumsun()运算的时候,又把结果从列向量转换成了行向量。仅从这两行代码里面,就大概只能看出这个意思了。不过简单一说,现在看不出来这个遗传算法的核心是什么样的,一般的神经网络里面只有连锁交换定律的应用,一般没有基因分离定律的应用。看这个样子,这是分离出来然后自由配对的做法,应该是比较高端的东西吧。function [ rbf ] = RankBoost( X,Y,D,T )
%RankBoost implemetation of RankBoost algoritm
% Input:
% X - train set.
% Y - train labels.
% D - distribution function over X times X, it the form of 2D matrix.
% T - number of iteration of the boosting.
% Output:
% rbf - Ranking Function.
rbf = RankBoostFunc(T)
% w - the current distribution in any iteration, initilize to D
w = D
for t=1:T
tic
fprintf('RankBoost: creating the function, iteration %d out of %d\n',t,T)
WL = getBestWeakLearner(X,Y,w)
rbf.addWeakLearner(WL,t)
rbf.addAlpha(WL.alpha,t)
alpha=WL.alpha
%update the distribution
%eval the weak learnler on the set of X and Y
h=WL.eval(X)
[hlen, ~] = size(h)
% tmph = (repmat(h,1,hlen) - repmat(h',hlen,1))
% w=w.*exp(tmph.*alpha)
[rows, cols] = size(w)
sumw = 0
for r=1:rows
for c=1:cols
w(r,c) = w(r,c)*exp((h(r)-h(c))*alpha)
sumw = sumw + w(r,c)
end
end
%normalize w
% w = w./sum(w(:))
w = w./sumw
toc
end
end
评论列表(0条)