背景

最近有机器学习的任务,不可避免找上了python,语言简单,库多代码简洁,除了运行效率其他的没啥诟病,是个非常理想的机器学习首选开发语言。

入门阶段鄙人基本找的菜鸟教程,w3cschool等,因为其他的我暂时也没那个能力去理解。

在w3cschool的机器学习算法入门篇中,我看到了求数组众数的实现,其利用的是scipy包下的stats模块的mode函数,实现的算法思想是求数组中最小的众数,由于我不知道其还有没有求解所有众数的函数,故此自定义一个,一是满足自身虚荣感,而是填补求知欲。

思想

1.一个字典来维护每个数字出现的次数

2.一个集合来维护众数

3.遍历整个数组,对每个元素记录其出现的次数,若与集合中出现次数最大的数一致,则其也是众数,亦将其加入集合中。若其出现次数最大,则挤兑掉集合中其他数,其成为集合中唯一的元素

4.时间复杂度O(n)【仅遍历数组一次】,空间复杂度O(n)【一个集合,一个字典】

实现

arr=[86,86,86,86,87,87,87,87]

#返回所有众数
def mymode(arr):
	d=dict()
	result=set()
	for item in arr:
		if item in d.keys():
			d[item]+=1
		else:
			d[item]=1
		if len(result)==0:
			result.add(item)
		else:
			pop=result.pop()
			if d[pop]==d[item]:
				result.add(pop)
				result.add(item)
			elif d[pop]>d[item]:
				result=set([item])
	return result,d
	
result,d=mymode(arr)
print(result)
print(d)

 结果

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐