协同过滤算法matlab代码疑难 50

idx_user=idx(user);%indexofthegroupwhichtheuserbelongstoidx_original=find(idx==idx_us... idx_user=idx(user); %index of the group which the user belongs to
idx_original=find(idx==idx_user); %idex of users of this cluster in the original matriz
%load similarity matriz of users
switch lower(method)
case 'cosine'
load('SimilitudCosineUser.mat');
case 'correlation'
load('SimilitudCorrelationUser.mat');
case 'adjustedcosine'
load('SimilitudAdjustedCosineUser.mat');
end
%cluster
d_user=d(user,idx_original);%the cosine similarity between the our user with the rest of the users in this cluster
[temp,temp1]=sort(d_user,'descend'); %find the nearest neighbor in this cluster of our usr
if length(d_user)<knear
knear=length(d_user);
end
sim=temp(1:knear); %similary value between our user and its neighbors of this cluster
idx_vecino=idx_original(temp1(1:knear)); %the real idx of this neighbors
idx_user_rated=find(data(:,item)~=0);%users who have been rated for this item
[idx_restOri,IdxRate,IdxSim]=intersect(idx_user_rated,idx_vecino);%the users of this cluster who have been rated for this item
if ~isempty(IdxSim)
SimVecino=sim(IdxSim); %the similarity between the active user and its neighbors of this cluster
RateItem=data(idx_restOri,item)';%ratings value of its neighbor of this cluster
PreUserItem=(SimVecino*RateItem')/sum(SimVecino);
end
%%
% determine whether other users of this cluster have rated for this item
if isempty(IdxSim)
D_ALLitem=d(user,1:end); %similarity between all the users
[tempALL,temp1ALL]=sort(D_ALLitem,'descend'); %find the nearest neighbor
IdxALL_vecino=temp1ALL(1:knear); %idx of neighbors
[ItemVecinoUser,IdxALLRate,IdxALLSim]=intersect(idx_user_rated,IdxALL_vecino);%users in these neighbors who have been rated this item
if ~isempty(IdxALLSim)
SimVecino=D_ALLitem(ItemVecinoUser);
RateItem=data(ItemVecinoUser,item)';%rating value of this item of those user who are also neighbor of the active user
PreUserItem=(SimVecino*RateItem')/sum(SimVecino);
end
if isempty(IdxALLSim)
%if there is no set intersection of user neighbor set and users
%who have voted for the active item
DUserRated=D_ALLitem(idx_user_rated); %similarity between all the users who voted for the active item and our active user
[UserRated,IdxUserRated]=sort(DUserRated,'descend'); % rearrange the above similarity
IdxUserRated=idx_user_rated(IdxUserRated); % real idx of the rearranged users
if length(idx_user_rated)<knear
knear=length(idx_user_rated);
end
SimVecino=UserRated(1:knear);
RateItem=data(IdxUserRated(1:knear),item)';%ratings about the active ite:m of those users with maximum similarity
PreUserItem=(SimVecino*RateItem')/sum(SimVecino);
end
end
%INPUT:
%data: matriz of user-item
%item: idx of the item, for example, when it is 15, it means the 15th item
%user: idx of the user, for example, when it takes 5, it means the 5th user
%knear: number of neigbors
%Kcluster: number of clusters
%idx: idx of clusters
%method: similarity metric
%OUTPUT:
%PreUserItem: the predicted rating
%%

这是concha的算法,我不明白d_user=d(user,idx_original);%the cosine similarity between the our user with the rest of the users in this cluster这个d函数哪里来的,貌似运行有错误,%idx: idx of clusters这个参数也不理解。求大神指教。拜谢。
展开
 我来答
手机用户59523
2011-03-05 · TA获得超过195个赞
知道答主
回答量:163
采纳率:0%
帮助的人:126万
展开全部
来的:
% 下面举例说明遗传算法 %
% 求下列函数的最大值 %
% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %
% 将 x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为 (10-0)/(2^10-1)≈0.01 。 %
% 将变量域 [0,10] 离散化为二值域 [0,1023], x=0+10*b/1023, 其中 b 是 [0,1023] 中的一个二值数。 %
% %
%--------------------------------------------------------------------------------------------------------------%
%--------------------------------------------------------------------------------------------------------------%

% 编程
%-----------------------------------------------
% 2.1初始化(编码)
% initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),
% 长度大小取决于变量的二进制编码的长度(在本例中取10位)。
%遗传算法子程序
%Name: initpop.m
%初始化
function pop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为 行数为popsize,列数为chromlength的矩阵,
% roud对矩阵的每个单元进行圆整。这样产生的初始种群。

% 2.2.2 将二进制编码转化为十进制数(2)
% decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置
% (对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。本例为1),
% 参数1ength表示所截取的长度(本例为10)。
%遗传算法子程序
%Name: decodechrom.m
%将二进制编码转换成十进制
function pop2=decodechrom(pop,spoint,length)
pop1=pop(:,spoint:spoint+length-1);
pop2=decodebinary(pop1);

% 2.4 选择复制
% 选择或复制操作是决定哪些个体可以进入下一代。程序中采用赌轮盘选择法选择,这种方法较易实现。
% 根据方程 pi=fi/∑fi=fi/fsum ,选择步骤:
% 1) 在第 t 代,由(1)式计算 fsum 和 pi
% 2) 产生 的随机数 rand( .),求 s=rand( .)*fsum
% 3) 求 ∑fi≥s 中最小的 k ,则第 k 个个体被选中
% 4) 进行 N 次2)、3)操作,得到 N 个个体,成为第 t=t+1 代种群
%遗传算法子程序
%Name: selection.m
%选择复制
function [newpop]=selection(pop,fitvalue)
totalfit=sum(fitvalue); %求适应值之和
fitvalue=fitvalue/totalfit; %单个个体被选择的概率
fitvalue=cumsum(fitvalue); %如 fitvalue=[1 2 3 4],则 cumsum(fitvalue)=[1 3 6 10]
[px,py]=size(pop);
ms=sort(rand(px,1)); %从小到大排列
fitin=1;
newin=1;
while newin<=px
if(ms(newin))<fitvalue(fitin)
newpop(newin)=pop(fitin);
newin=newin+1;
else
fitin=fitin+1;
end
end

% 2.5 交叉
% 交叉(crossover),群体中的每个个体之间都以一定的概率 pc 交叉,即两个个体从各自字符串的某一位置
% (一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,假设2个父代个体x1,x2为:
% x1=0100110
% x2=1010001
% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:
% y1=0100001
% y2=1010110
% 这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。
% 事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。
%遗传算法子程序
%Name: crossover.m
%交叉
function [newpop]=crossover(pop,pc)
[px,py]=size(pop);
newpop=ones(size(pop));
for i=1:2:px-1
if(rand<pc)
cpoint=round(rand*py);
newpop(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:py)];
newpop(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:py)];
else
newpop(i,:)=pop(i);
newpop(i+1,:)=pop(i+1);
end
end

% 2.6 变异
% 变异(mutation),基因的突变普遍存在于生物的进化过程中。变异是指父代中的每个个体的每一位都以概率 pm 翻转,即由“1”变为“0”,
% 或由“0”变为“1”。遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局最优解。
%遗传算法子程序
%Name: mutation.m
%变异
function [newpop]=mutation(pop,pm)
[px,py]=size(pop);
newpop=ones(size(pop));
for i=1:px
if(rand<pm)
mpoint=round(rand*py);
if mpoint<=0
mpoint=1;
end
newpop(i)=pop(i);
if any(newpop(i,mpoint))==0
newpop(i,mpoint)=1;
else
newpop(i,mpoint)=0;
end
else
newpop(i)=pop(i);
end
end

很多哈,也很麻烦,但是设计程序就是如此!得耐心点才行。 最近又作了些总结,要有兴趣百度HI我吧。我有M文件,运行成功
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
CppArk
2012-08-31
知道答主
回答量:2
采纳率:0%
帮助的人:3145
展开全部
d(user,idx_original); 这个d是上面switch语句load进来的,那个文件保存的变量就是矩阵d。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
天天快乐郎
2011-03-04 · TA获得超过547个赞
知道小有建树答主
回答量:696
采纳率:0%
帮助的人:407万
展开全部
means 聚类算法

算法本身挺简单的,建议你自己试着编一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式