fengdu78 / lihang-code

《统计学习方法》的代码实现
18.66k stars 6.26k forks source link

关于KNN中predict函数的疑问 #17

Open niefangchao opened 5 years ago

niefangchao commented 5 years ago

您好,在此函数统计阶段,最后排序是对yi的标签出现的次数排序,但是单独拿出来代码好像是对yi标签的排序。求解答

yzl123456 commented 5 years ago

我来简单的发表下自己的看法,欢迎大家一起交流 下面是我用来测试的代码 from collections import Counter li = [1,2,3,1,1,2,1] c = Counter(li) print(c) s = sorted(c,key = lambda x:x) print(s) 输出: Counter({1: 4, 2: 2, 3: 1}) [1, 2, 3]

Counter 返回的结果是一个Counter对象,里面大致是一个key = 元素值,value = 该元素出现的次数 s = sorted(c,key = lambda x:x) 这里默认是按value从大到小降序排列,返回对应的元素值,不加这个key = func 也是一样

我自己的实现代码这部分是这样写的: 取出所有的类别标签 count_paris 为count对象,类似一个字典,key为元素值,value为元素值出现的次数 默认按value值从大到小进行排序,返回排序完成后的key,也可以自己重载比较运算函数 key = func 应当返回出现次数最多的那个标签 knn = [ k[-1] for k in knn_list] count_pairs = Counter(knn) max_count = sorted(count_pairs) return max_count[0]

不知道我的理解是否正确,我觉得是这个代码写挫了....我觉得我自己写的才是对的....欢迎大家探讨交流

我会把每个章节的代码review过后加上自己的理解,以及完备的注释,然后开源到自己的github上,欢迎大家探讨学习,现在还没弄完,先放个github主页占个坑:https://github.com/yzl123456

Sinica1997 commented 5 years ago

是写错了 我很早之前就自己改过来了

---原始邮件--- 发件人: "zoin"notifications@github.com 发送时间: 2019年7月8日(星期一) 上午10:22 收件人: "fengdu78/lihang-code"lihang-code@noreply.github.com; 抄送: "Subscribed"subscribed@noreply.github.com; 主题: Re: [fengdu78/lihang-code] 关于KNN中predict函数的疑问 (#17)

我来简单的发表下自己的看法,欢迎大家一起交流 下面是我用来测试的代码 from collections import Counter li = [1,2,3,1,1,2,1] c = Counter(li) print(c) s = sorted(c,key = lambda x:x) print(s) 输出: Counter({1: 4, 2: 2, 3: 1}) [1, 2, 3]

Counter 返回的结果是一个Counter对象,里面大致是一个key = 元素值,value = 该元素出现的次数 s = sorted(c,key = lambda x:x) 这里默认是按value从大到小降序排列,返回对应的元素值,不加这个key = func 也是一样

我自己的实现代码这部分是这样写的:

取出所有的类别标签 knn = [ k[-1] for k in knn_list] # count_paris 为count对象,类似一个字典,key为元素值,value为元素值出现的次数 count_pairs = Counter(knn) # 默认按value值从大到小进行排序,返回排序完成后的key,也可以自己重载比较运算函数 key = func max_count = sorted(count_pairs) #应当返回出现次数最多的那个标签 return max_count[0]

不知道我的理解是否正确,我觉得是这个代码写挫了....我觉得我自己写的才是对的....欢迎大家探讨交流

我会把每个章节的代码review过后加上自己的理解,以及完备的注释,然后开源到自己的github上,欢迎大家探讨学习,现在还没弄完,先放个github主页占个坑:https://github.com/yzl123456

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

yzl123456 commented 5 years ago

我纠正一下自己的说法,sorted(count_pairs)似乎是只根据key进行升序排序。。。 所以此处应该用 most_common 函数 max_count = count_pairs.most_common(1) return max_count[0]

fengdu78 commented 5 years ago

count_pairs = sorted(counter.items(), key=lambda x: (-x[1], x[0]))