我们的老师要求我们根据所拥有的信息(音乐,书籍,电影,体育,人物)使用任何分类器来猜测Facebook用户是男性还是女性。
我将音乐,书籍和电影分为流派和体育,以YES / NO和人(如果他喜欢男性或女性的页面)给女人/男人。
例如Music(1,1)=Hip Hop
,Music(2,1)=Pop
。
在第二栏中,如果用户是男性或女性,我会猜测。
例如,我猜到了if Movie=Romantic then gender=woman
等。
然后我制作了一个名为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)
剪影前的左图
为什么他们离质心这么远?我该如何解决这个问题?
答案 0 :(得分:1)
您可能正在寻找 k -means群集。这个想法很简单:我们估计一个"原型"男性和女性。如果数据点(人)更接近平均值,原型男性,那么它也将是男性。如果数据点更接近普通女性,那么它将是女性。我们使用以下算法执行此操作:
我们的两个质心点是我们的"原型"男性和女性的平均值:女性的平均值是指女性的#34;群集,平均男性是"男性"的质心。群集。
到目前为止,这个任务是完全随机的 - 现在我们必须迭代地将我们的聚类拟合到我们拥有的数据。
这个新的平均值是真实底层集群平均值的近似值。因此,我们重复步骤2,将数据点分配给更正的簇。以前的一些数据点"女性"现在将分配给"男性",反之亦然。当然,有些人会保持不变。
随着我们的聚类发生变化,我们在步骤3中计算出的平均值也发生了变化,因此我们重复步骤3,找到新的聚类质心。因此,我们还必须再次重复步骤2,再次重复步骤3,依此类推。我们重复第2步和第3步,直到我们的任务不再发生变化,这意味着我们找到了解决方案。
在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个输入变量,可以是0
或1
。这样做的好处是,您也可以使用连续值:喜欢两个流行乐队和3个金属乐队的人可以获得Pop的0.4
和Metal的0.6
。