美文网首页
训练集划分

训练集划分

作者: 穿靴子的M | 来源:发表于2018-11-21 21:05 被阅读0次

    思路:

    确定测试集边数,逐条抽取随机边从原net删除,判断是否可删,可删则添加进test,否则还原回原net,函数最终返回train和test


    ceil

    Round towards plus infinity,向右取整

    nnz(S)

    is the number of nonzero elements in S.非零元数目

    tril

    tril(X) is the lower triangular part of X.提取下三角

    tril(X,K) is the elements on and below the K-th diagonal of X .  K = 0 is the main diagonal, K > 0 is above the main diagonal and K < 0 is below the main diagonal.

    sparse

    sparse(m,n) generates an m-by-n all zero sparse matrix.构建全零m*n稀疏矩阵


    whos

    显示矩阵信息

    %function [ train test ] = DivideNet( net, ratioTrain )

    %%划分训练集和测试集,保证训练集连通

    ratioTrain=0.9;

        num_testlinks = ceil((1-ratioTrain) * nnz(net)/2);%nnz非零元数目【即边的数目】;ceil向右取整   

        % 确定测试集的边数目

        %ceil  Round towards plus infinity

        %nnz(S) is the number of nonzero elements in S.

        [xindex, yindex] = find(tril(net));  linklist = [xindex yindex];%tril提取下三角 

    下三角中的非零元 非零元坐标存入xy

        % 将网络(邻接矩阵)中所有的边找出来,存入linklist

        clear xindex yindex;

        % 为每条边设置标志位,判断是否能删除

        test = sparse(size(net,1),size(net,2));%size分别取第一列第二列的行数大小构建稀疏矩阵

    行数均为5

        while (nnz(test) < num_testlinks)

            %---- 随机选择一条边

            index_link = ceil(rand(1) * length(linklist));【以linklist长度入手,0-1之间随机数定位到linklist中的某一行】   

            uid1 = linklist(index_link,1); %【某行第一列】

            uid2 = linklist(index_link,2); %【某行第二列】

    取第六行,两节点分别为5,4

            %---- ????判断所选边两端节点uid1和uid2是否可达,若可达则可放入测试集,否则重新挑选一条边

            net(uid1,uid2) = 0;    net(uid2,uid1) = 0;

            % 将这条边从网络中挖去用以判断挖掉后的网络是否还连通??

            tempvector = net(uid1,:);%uid1为节点1与uid1相连

            % 取出uid1一步可达的点,构建成一维向量

    表示节点2,3与节点5一步可达

            sign = 0;

            % 标记此边是否可以被移除,sign=0表示不可; sign=1表示可以

            uid1TOuid2 = tempvector * net + tempvector;     

            % uid1TOuid2表示二步内可达的点(二步达+一步达)

    二步可达

            if uid1TOuid2(uid2) > 0%??? %【不可达时uid2位置为0】【uid1-uid2已置0,所以不再能一步达,需看2步及以上能否可达】

                sign = 1;           

                % 二步即可达

            else

                while (nnz(spones(uid1TOuid2) - tempvector) ~=0) %??

    【进一次循环uid1TOuid2就尽可能增大一次,  tempvector = spones(uid1TOuid2);也就尽可能增大一次,多次之后可达的点不在增加,趋于稳定,spones(uid1TOuid2) - tempvector将会为0,退出循环】

                % 直到可达的点到达稳定状态,仍然不能到达uid2,此边就不能被删除

                    tempvector = spones(uid1TOuid2);

                    uid1TOuid2 = tempvector * net + tempvector; 

                    % 此步的uid1TOuid2表示K步内可达的点

    为真值了

                    if uid1TOuid2(uid2) > 0    %【不可达时uid2位置为0,运行k次,k步可达了这个位置就为真值了】

                        sign = 1;   

                        % 某步内可达

                        break;

                    end

                end

            end

            % 结束-判断uid1是否可达uid2

            %----若此边可删除,则将之放入测试集中,并将此边从linklist中移除

            if sign == 1 %此边可以删除

                linklist(index_link,:) = []; %与此节点相连的边全删除

                test(uid1,uid2) = 1;%加入测试集

            else

                linklist(index_link,:) = [];

                net(uid1,uid2) = 1;%不能删除,还原原来net

                net(uid2,uid1) = 1;

            end

            % 结束-判断此边是否可以删除并作相应处理

        end

        % 结束(while)-测试集中的边选取完毕

        train = net;  test = test + test';

        % 返回为训练集和测试集


    相关文章

      网友评论

          本文标题:训练集划分

          本文链接:https://www.haomeiwen.com/subject/qpmyfqtx.html