Matlab Facebook信息性别认知

时间:2016-11-30 22:00:45

标签: matlab classification

我们的老师要求我们根据所拥有的信息(音乐,书籍,电影,体育,人物)使用任何分类器来猜测Facebook用户是男性还是女性。

我将音乐,书籍和电影分为流派和体育,以YES / NO和人(如果他喜欢男性或女性的页面)给女人/男人。
例如Music(1,1)=Hip HopMusic(2,1)=Pop

在第二栏中,如果用户是男性或女性,我会猜测。
例如,我猜到了if Movie=Romantic then gender=woman等。

  

Changed Genres Matrix

然后我制作了一个名为MuMoBSP(音乐,电影,书籍,体育,人物)的矩阵,我输入了猜测,其中男性为1,女性为2。

我发现了一种类似于C ++的方法,但是我需要使用分类器。 你能救我吗?

我的代码是:

MuMoBSP=[1 1;2 1;3 2;4 2;5 2;6 2;7 1;8 1;9 1;10 1;11 1;12 2;13 2;14 2;15 2;16 2;17 1;18 1;19 1;20 1;21 1;22 1;23 1;24 2;25 2;26 2;27 2;28 1;29 2;30 1;31 2]


    filename='Facebook.csv'
    Data=dlmread(filename)

    %Music Based Gender%
    for k=1:6
        if (Data(1,1)==MuMoBSP(k,1))
            Gender(1,1)=MuMoBSP(k,2);
        end
    end

    %Movies Based Gender%
    for k=7:16
        if (Data(1,2)==MuMoBSP(k,1))
            Gender(1,2)=MuMoBSP(k,2);
        end
    end

    %Books Based Gender%
    for k=17:27
        if (Data(1,3)==MuMoBSP(k,1))
            Gender(1,3)=MuMoBSP(k,2);
        end
    end

    %Sports Based Gender%
    for k=28:29
        if (Data(1,4)==MuMoBSP(k,1))
            Gender(1,4)=MuMoBSP(k,2);
        end
    end

    %People Based Gender%
    for k=30:31
        if (Data(1,5)==MuMoBSP(k,1))
            Gender(1,5)=MuMoBSP(k,2);
        end
    end

    %Print if Man/Woman%
    if (sum(Gender)== 9)
        sprintf('woman');
    end
    if (sum(Gender)== 8)
        sprintf('woman');
    end
    if (sum(Gender)== 7)
        sprintf('man');
    end
    if (sum(Gender)== 6)
        sprintf('man');
    end
    if (sum(Gender)== 5)
        sprintf('man');
    end
    if (sum(Gender)== 10)
        sprintf('woman');
    end

Facebook.csv文件如下。第一栏是音乐,第二栏是电影,第三栏是书籍,第四栏是体育,第五栏是人。

2;7;17;28;30
1;8;17;28;30
2;10;23;28;30
2;11;22;28;30
1;7;21;28;30
2;9;18;28;30
1;7;19;28;30
3;12;24;29;31
4;14;27;29;31
4;16;27;29;31
6;13;25;29;31
6;14;26;29;31
5;16;27;29;31
5;12;26;29;31
  

更新   我更改了MuMoBSP和数据表(参见顶部),如 hbaderts 建议。

MuMoBSP =

     1     1
     2     1
     3     2
     4     2
     5     2
     6     2
     7     1
     8     1
     9     1
    10     1
    11     1
    12     2
    13     2
    14     2
    15     2
    16     2
    17     1
    18     1
    19     1
    20     1
    21     1
    22     1
    23     1
    24     2
    25     2
    26     2
    27     2
    28     1
    29     2
    30     1
    31     2

我尝试使用k-means函数,但我认为我犯了一些错误。

[idx,C] = kmeans(Data,2);
figure;
plot(Data(idx==1,1),Data(idx==1,2),'r.','MarkerSize',20)
hold on
plot(Data(idx==2,1),Data(idx==2,2),'b.','MarkerSize',20)
plot(C(:,1),C(:,2),'kx',...
     'MarkerSize',15,'LineWidth',3)
legend('Cluster 1','Cluster 2','Centroids',...
       'Location','NW')
title 'Cluster Assignments and Centroids'
hold off
silhouette(Data,idx)

剪影前的左图 Plot

为什么他们离质心这么远?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

理论

您可能正在寻找 k -means群集。这个想法很简单:我们估计一个"原型"男性和女性。如果数据点(人)更接近平均值,原型男性,那么它也将是男性。如果数据点更接近普通女性,那么它将是女性。我们使用以下算法执行此操作:

  1. 选择 k (在您的情况下:2)随机初始质心点。
  2. 我们的两个质心点是我们的"原型"男性和女性的平均值:女性的平均值是指女性的#34;群集,平均男性是"男性"的质心。群集。

    1. 对于每个数据点,我们计算最近的质心。如果数据点更靠近质心1,我们分配例如标签"男"。如果它更靠近质心2,我们会分配标签" Female"。
    2. 到目前为止,这个任务是完全随机的 - 现在我们必须迭代地将我们的聚类拟合到我们拥有的数据。

      1. 对于这两个群集,我们计算所有数据点的新平均值,即我们的"男性"平均音乐类型,平均电影类型等等。和"女性"集群。
      2. 这个新的平均值是真实底层集群平均值的近似值。因此,我们重复步骤2,将数据点分配给更正的簇。以前的一些数据点"女性"现在将分配给"男性",反之亦然。当然,有些人会保持不变。

        随着我们的聚类发生变化,我们在步骤3中计算出的平均值也发生了变化,因此我们重复步骤3,找到新的聚类质心。因此,我们还必须再次重复步骤2,再次重复步骤3,依此类推。我们重复第2步和第3步,直到我们的任务不再发生变化,这意味着我们找到了解决方案。

        在MATLAB中实现

        在Matlab中,有一个kmeans函数,这使得它像调用

        一样简单
        idx = kmeans(Data, 2);
        

        当然,Matlab并不了解"男性"或者"女性",所以只有第1组和第2组,你的工作是判断哪一个是男性,哪个是女性。我认为,喜欢科幻电影和书籍,观看体育比赛并关注女性简介的人将是男人; - )

        但等等......

        让我们看一下音乐偏好:在您的代码中,您说出以下内容:

        1: Hip Hop     Male
        2: Pop         Female
        3: Jazz        Female
        4: Metal       Male
        5: Blues       Female
        6: Rock        Female
        
        如果这6个偏好同样可能,那么普通人将拥有"音乐价值" (1+4)/2 = 2.5和一位女性将拥有平均音乐价值" (2+3+5+6)/4 = 4。所以喜欢流行音乐的人更有可能成为男性,即使我们不想要这样!

        为什么会这样? - 对于 k - 意味着聚类,我们需要输入,其中低值对应于cluster-1,而高值对应于cluster-2(或者反过来,这并不重要) 。重要的是,我们需要输入,以便我们计算有意义的平均人数。#/ p>

        如果你能说,嘻哈是一个有点男子气概"和金属是非常有男子气概的#34;音乐,而摇滚是有点女人味的,而蓝调则更具女性气质,而爵士则更具女人味,#34;和Pop是非常女性化的#34;,您可以将标签更改为

        1: Metal
        2: Hip Hop
        3: Rock
        4: Blues
        5: Jazz
        6: Pop
        
        然后,一个具有很高价值的人倾听"女性化"音乐,而有价值的人则倾听" manly"音乐。普通人的值为1.5,普通女性的值为4.5

        如果不是这种情况(可能是你的情况),你可以创建一堆新的输入变量:

        x_1: Person likes Hip-Hop
        x_2: Person likes Pop
        ...
        

        其中每个变量都是0(false)或1(true)。您可以使用例如输入变量而不是5个输入变量。 31个输入变量,可以是01。这样做的好处是,您也可以使用连续值:喜欢两个流行乐队和3个金属乐队的人可以获得Pop的0.4和Metal的0.6