gqqnbig / cs145project

0 stars 2 forks source link

学习一下类似算法 #6

Closed gqqnbig closed 4 years ago

gqqnbig commented 5 years ago

https://juejin.im/post/5afbfe316fb9a07aa5427d73

xiaoz97 commented 5 years ago

用亲和性分析方法推荐电影(A Priori) https://www.jianshu.com/p/5b9b1486e163

gqqnbig commented 5 years ago

你可以运行一下它的代码,并把代码推送到github。然后再修改它看看能不能应用于我们的数据集。

推送的时候要不你推送到branch 6-other-algorithms

gqqnbig commented 5 years ago

我把for k in range(2, 20):改成了 for k in range(2, 5):

运行到最后抛出异常 TypeError: Object of type frozenset is not JSON serializable

你再改一下,不要运行出错

xiaoz97 commented 5 years ago

昨天的代码是最初版没有改完,今天上传了可运行的版本。

gqqnbig commented 5 years ago
21:43 $ ./apriori.py
      support                 itemsets
0    0.241226                      (0)
1    0.108607                      (5)
2    0.105405                     (16)
3    0.218012                     (31)
4    0.130496                     (33)
..        ...                      ...
215  0.125424          (352, 315, 293)
216  0.121417          (587, 315, 293)
217  0.101413          (523, 587, 315)
218  0.111201       (1176, 1163, 1165)
219  0.101862  (1176, 257, 1163, 1165)

[220 rows x 2 columns]

我用了mlxtend模块里的apriori算法,support=0.1,跑出来是这样的。你试试。

你pull这个branch就可以获取我的代码。

xiaoz97 commented 4 years ago

我把这个也跑通了,但是准确率还是不行,没有决策树高。那个方法和mlxtend预测准确率都只有0.5左右........感觉单从电影来判断不太行,几千个里面才能找到一个有pattern的来预测,预测出来的准确率也不行QAQ

gqqnbig commented 4 years ago
def flatNestList(a):
    return [item for sublist in a for item in sublist]

np.unique(flatNestList(sorted_confidence[:,1]))

发现规则只包含70部电影。我们总共有13万部电影。

select * from ValidationRatings
where movieId in (  0,    5,   16,   31,   33,   35,   46,   49,  108,  109,  148,
        159,  163,  220,  257,  290,  293,  315,  352,  353,  360,  373,
        376,  453,  476,  523,  537,  582,  583,  584,  587,  602,  734,
        762,  839,  882,  890,  897,  902, 1011, 1061, 1069, 1106, 1161,
       1163, 1164, 1165, 1167, 1172, 1174, 1176, 1179, 1180, 1187, 1188,
       1204, 1222, 1229, 1234, 1255, 1471, 1518, 1554, 1635, 1930, 2225,
       2466, 2654, 2750, 2847)

DB Browser for SQLite_2019-11-21_23-33-13

用这句SQL可以看到,validation set的3999236行里,有18597行包含这70部电影。

假设涉及这70部电影的行我们全部分类正确,正确率只有0.46%,其余的行只能按50%比例瞎猜。

如果降低支持度,我们可以收集到更多的电影,但应该需要用一些比例去计算用户是不是喜欢某一部电影。

比如电影A属于电影集合{A,B,C,D},一个用户只看了{B,C},他大概有百分之六七十概率喜欢A。你原来的链接和https://blog.csdn.net/jj88888/article/details/78035540 有提到这个算法。

另一个思路是用电影名称里的单词。可能用户对某些词特别喜欢??

这个issue你可以close了。你可以新建一个issue或者在 #18 继续做。