24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2689  |  回复: 9

yqx1985

木虫 (著名写手)

云中仙

[求助] MATLAB如何随机分组数据

大家好我有一组数据,想对它进行随即分组,该如何完成?

举例如下:假设我有6个数据,不放设为 data=rand(1,6); 我想将这6个数据随机分为3组,注意是随机,每组含有数据是要可以变化的。

比如,这一次分组情况:数据data(1)和data(2)分到了一组,data([3,4,5])分到了另一组,data(6)分到了最后一组。
下次的分组情况:数据data(1)和data(2)分到了一组,data([3,4])分到了另一组,data([5,6])分到了最后一组。
以此等等……

因为每组所含的数据个数是不同的,所以类似我的这样的分组问题matlab是否已有提供函数或谁有好的方法实现呢?

这个问题我觉得主要是一个排列组合问题,6个样本分成3组实际上也就有那么几种方式,即:114(表示有一个组内有一个样本,另一个组内有一个样本,最后一个组内有三个样本),123,222。

所以问题可以转化成,N个样本分成m组,有几种方式?不知道这样说的话,大家是否有好的方法或建议呢?
回复此楼

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

人面不知何时去,桃花依旧笑春风
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

leedobb

金虫 (正式写手)

【答案】应助回帖

yqx1985(金币+4): 辛苦辛苦了 2011-09-05 23:51:03
我随手编个m文件给你试试吧。编的有点复杂了。呵呵。


clear all;
data =rand(1,50);
N_div = 10;
nn =size(data); N=nn(2);

%%%% randomly redistribute this N numbers
IsRepeated = 1;
RDis(1) = 0;
for i =1:N
     IsRepeated = 1;
   while(IsRepeated == 1)
     J = floor(rand*N+1) ;
     
     if(i==1)
      IsRepeated = 0;
     end
     if(i>1)
      IsRepeated = 0;
      for j=1:i-1
       if(J==RDis(j))
           IsRepeated = 1;
       end
      end
      if(J>N)
          IsRepeated = 1;
      end
     end
   end
   RDis(i) =J;
   
   
end
%%% insert random blocks between numbers (balls).

IsRepeated = 1;
BDis(1) = 0;
for i =1:N_div-1
     IsRepeated = 1;
   while(IsRepeated == 1)
     J = floor(rand*(N-1)+1) ;
     
     if(i==1)
      IsRepeated = 0;
     end
     if(i>1)
      IsRepeated = 0;
      for j=1:i-1
       if(J==BDis(j))
           IsRepeated = 1;
       end
      end
      if(J>N-1)
          IsRepeated = 1;
      end
     end
   end
   BDis(i) =J;
end

BDis = sort(BDis);
NumDis(1,1:BDis(1)) = RDis(1:BDis(1));
NumD (1) = BDis(1);
for i=1:N_div-2
NumDis(i+1,1:BDis(i+1)-BDis(i)) =RDis(BDis(i)+1:BDis(i+1));
NumD (i+1) = BDis(i+1)-BDis(i);
end
NumDis(N_div,1:N-BDis(N_div-1)) = RDis(BDis(N_div-1)+1:N);
NumD (N_div) = N-BDis(N_div-1);

NumDis
有一天,我打了个瞌睡就到了这里,但我知道我掉入了时光的循环中,虽得以永生,但只有第一个循环有意义。
2楼2011-09-05 17:31:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

leedobb

金虫 (正式写手)

引用回帖:
2楼: Originally posted by leedobb at 2011-09-05 17:31:46:
我随手编个m文件给你试试吧。编的有点复杂了。呵呵。


clear all;
data =rand(1,50);
N_div = 10;
nn =size(data); N=nn(2);

%%%% randomly redistribute this N numbers
IsRepeated = 1;
RDis(1) = ...

忘了任务了,请最后再加上下面四行,呵呵。


for i = 1:N_div
    Data_out(i,1:NumD(i)) = data(NumDis(i,1:NumD(i)));
end
Data_out
有一天,我打了个瞌睡就到了这里,但我知道我掉入了时光的循环中,虽得以永生,但只有第一个循环有意义。
3楼2011-09-05 18:19:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiuyouxu

铁杆木虫 (职业作家)

【答案】应助回帖


小雨萌萌(金币+1): 谢谢关注~ 2011-09-08 16:26:46
假设n个数, 分成m组, 先产生m个[0,1]之间的随机数, 设为ri, 然后以ri/sum(ri)为权重得到第i组的长度为mi=n*ri/sum(ri), 然后从1:n里依次随机选择mi个数, 并从1:n里去掉这些数, 继续直到选择m组.
忘记自己,忘记一切烦恼(欢迎访问我的网站兆字节:http://www.mathbeta.com/)
4楼2011-09-05 21:32:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiuyouxu

铁杆木虫 (职业作家)

【答案】应助回帖

yqx1985(金币+1): 谢谢应助 2011-09-06 00:12:06
引用回帖:
4楼: Originally posted by xiuyouxu at 2011-09-05 21:32:00:
假设n个数, 分成m组, 先产生m个[0,1]之间的随机数, 设为ri, 然后以ri/sum(ri)为权重得到第i组的长度为mi=n*ri/sum(ri), 然后从1:n里依次随机选择mi个数, 并从1:n里去掉这些数, 继续直到选择m组.

这里的mi可能不是整数, 需要向下取整, 这样最后的和难以保证为n, 可以将最后一个mi取为n减前m-1个mi的和
忘记自己,忘记一切烦恼(欢迎访问我的网站兆字节:http://www.mathbeta.com/)
5楼2011-09-05 21:34:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yqx1985

木虫 (著名写手)

云中仙

引用回帖:
2楼: Originally posted by leedobb at 2011-09-05 17:31:46:
我随手编个m文件给你试试吧。编的有点复杂了。呵呵。


clear all;
data =rand(1,50);
N_div = 10;
nn =size(data); N=nn(2);

%%%% randomly redistribute this N numbers
IsRepeated = 1;
RDis(1) = ...

程序写的不错,可以满足要求,不过还是有几点建议:
(1)最好去掉 第一句 clear all 这个命令。
这个命令危害很大,往往做了半天的工作,可能在引用到含有该命令的语句时而前功尽弃;由于该命令的存在,你的脚本程序不能转化为一个函数应用,这导致你的程序虽然能完成功能,但一次只能生成一个可能的结果。而实际工作中,我们还是希望能够一次生成一系列的结果。如果将clear all去掉而强制性生成函数后,你的代码产生的结果会随着迭代的增加而出错,直至达到稳定的结果(你可以尝试下),具体为什么我没有细看。

(2)你的代码中有一段是生成随机排列的不重复整数(%% randomly redistribute this N numbers),你为此采用了一些循环判断的方法,实际上可以通过下面简单的方法实现:
RAND=rand(N,1);
[S,RDis]=sort(RAND);

RDis=randperm(N);

(3)尽量在引入未知变量时,对变量提前给出定义和内存分配

--------------------------------------------------------------------------------------------------------------
总之感谢您的热情帮助!
人面不知何时去,桃花依旧笑春风
6楼2011-09-06 00:09:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yqx1985

木虫 (著名写手)

云中仙

引用回帖:
5楼: Originally posted by xiuyouxu at 2011-09-05 21:34:21:
这里的mi可能不是整数, 需要向下取整, 这样最后的和难以保证为n, 可以将最后一个mi取为n减前m-1个mi的和

想法不错,也很简单。
需要解决的问题可能就在于如何对mi取整,向下取整肯定不行,这样会出现很多0;如果强制将mi中小于1的变为1,则可能sum(mi)可能会超出n,尤其在分组较多,mi中小于1的数较多的时候,这是个问题。
------------------------------------------------------------------------------------------------------------------
还是很感谢啦
人面不知何时去,桃花依旧笑春风
7楼2011-09-06 00:17:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

leedobb

金虫 (正式写手)

引用回帖:
6楼: Originally posted by yqx1985 at 2011-09-06 00:09:20:
程序写的不错,可以满足要求,不过还是有几点建议:
(1)最好去掉 第一句 clear all 这个命令。
这个命令危害很大,往往做了半天的工作,可能在引用到含有该命令的语句时而前功尽弃;由于该命令的存在,你的脚本 ...

迭代出错的问题,你自己去把几个主要变量先定义及赋零就可以了,没什么问题。
有一天,我打了个瞌睡就到了这里,但我知道我掉入了时光的循环中,虽得以永生,但只有第一个循环有意义。
8楼2011-09-06 10:07:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yqx1985

木虫 (著名写手)

云中仙

引用回帖:
8楼: Originally posted by leedobb at 2011-09-06 10:07:32:
迭代出错的问题,你自己去把几个主要变量先定义及赋零就可以了,没什么问题。

function BlockOfEachVariable=RandVG(Lvariable,Lblock,PopulationSize,Population)
%
% Lvariable is the length of variable, Lblock is the length of block
% Purpose: Generate Lblock block for Lvariable Variable in PopulationSize
% Through This Process, All Variable Will Find It's Block according Population
% Such as BlockOfEachVariable=2 3 1
%                                          1 1 3
%                                          2 3 2
% It means that in 1st chromosome, Variable 1-3 belong to 2,3,1 block respectively
%               in 2nd chromosome, Variable 1-3 belong to 1,1,3 block respectively
%               in 3rd chromosome, Variable 1-3 belong to 2,3,2 block respectively
% The PopulationSize is 3, which is equall to the row of Population
%%  You can get a rand BLock marix with row to PopulationSize and column to %LBlock if Population is unspecific; If Population is specific, RandVG tries to convert %Population to BLock marix. Here, Population is a binary matrix, which is used for %genetic algorithm to optimum BLock marix for a certain purpose; If the cassette is %specific, a MC methode is used for getting rand BLock marix.
if nargin<4,Lgrid=length(dec2bin(Lblock));Population=randint(PopulationSize,Lgrid*Lvariable);end
%% ---- Used When Composition of Each Variable is Specific, i.e.,
% Lblock=[1,2,3,4],Which indicate variable number is 10(sum(Lblock)) and one
% variable in one cassette, and two variables in another cassette, three
% varlable in the third cassette....At other times, Block is just a number.
if length(Lblock)~=1
    Rand=rand(Lvariable,PopulationSize);[a2,a3]=sort(Rand);
for i=1opulationSize
    for o=1:length(Lblock) % com,[1,2,3],[2,2,2]...
    BlockOfEachVariable(a3((sum(Lblock(1))-Lblock(o)+1):sum(Lblock(1)),i),i)=o;   
    end

end
BlockOfEachVariable=BlockOfEachVariable';
return
end;
%% ----
Lgrid=length(dec2bin(Lblock));% A Block Contain Lgrid bin site

% q=randint(PopulationSize,Lgrid*Lvariable);

Max=ones(1,Lgrid);Max=bin2dec(num2str(Max));

for o=1opulationSize
for i=1:Lvariable
%     a=q(o,3*i-2:3*i);
    a=Population(o,Lgrid*(i-1)+1:Lgrid*i);
    b=num2str(a);
    v(o,i)=bin2dec(b);
end
end

w=zeros(PopulationSize,Lvariable);
for i=1:Lblock
    w(find(v>=Max/Lblock*(i-1)&v<=Max/Lblock*i))=i;
end
   
BlockOfEachVariable=w;
人面不知何时去,桃花依旧笑春风
9楼2011-09-08 09:27:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yqx1985

木虫 (著名写手)

云中仙

送鲜花一朵
我晕了
这个i=1: p 很容易变成 i=1:p啊
人面不知何时去,桃花依旧笑春风
10楼2011-09-08 09:30:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 yqx1985 的主题更新
信息提示
请填处理意见