python极差函数 python 求极值( 五 )


if vmax_appear:
max_appear=v;
if max_appear==1:
return;
mode_list=[];
for k,v in count_dict.items():
if v==max_appear:
mode_list.append(k);
return mode_list;
#求方差
@staticmethod
def variance(l):#平方的期望-期望的平方
s1=0;
s2=0;
for i in l:
s1+=i**2;
s2+=i;
return float(s1)/len(l)-(float(s2)/len(l))**2;
#求方差2
@staticmethod
def variance2(l):#平方-期望的平方的期望
ex=float(sum(l))/len(l);
s=0;
for i in l:
s+=(i-ex)**2;
return float(s)/len(l);
#主函数 , 测试
arr=[1,2,3,2,3,1,4];
print "极差为:{0}".format(Math.range(arr));
print "平均数为:{0:.2f}".format(Math.avg(arr));
print "中位数为:{0}".format(Math.median(arr));
print "众数为:{0}".format(Math.mode(arr));
print "方差为:{0:.2f}".format(Math.variance(arr));
print "方差为:{0:.2f}".format(Math.variance2(arr));
print;
#性能测试
arraylist=[];
for i in range(1,1000000):
arraylist.append(i);
random.shuffle(arraylist);
time_start=time.time();
print "方差为:{0:.2f}".format(Math.variance(arraylist));
time_end=time.time();
print "{0}s".format(time_end-time_start);
time_start=time.time();
print "方差为:{0:.2f}".format(Math.variance2(arraylist));
time_end=time.time();
print "{0}s".format(time_end-time_start);
运行结果如下:
关于这个程序有几点说明的:
(1)开头引入time与random主要是为了最后部分测试两种求方差的方式那种性能较优使用,一般情况下使用上述python极差函数我自定义的Math类,无须引入任何python包 。
(2)求任何一个统计量,用到除法,注意先将int先转float,否则精度损失严重,你是得到不到最后的正确答案的 。
(3)python中自带有求list所有元素之和的sum,求list中的最值max,min,对list中的元素进行从小到大的排序sort()都用了,其余只能让我们自己现实了 。
(4)这里无须考虑如果形式参数被传入一个字符串数组怎么办,因为这些工具类都是我们自己使用了 , 自己控制好要传递的数值 , 无须考虑这么多 。
(5)求众数最艰难,因为用不到任何python自带的方法,还要返回一个list , 因为众数的个数不定 , 统计数组中出现次数最多的数的时候,用到了python中的字典dict,《【Python】容器类》(点击打开链接) , 这个字典中,key是list中的数字,values是该数字出现的次数 。然后要求出现次数的最大值 , 最后再求出改最大值对应的key 。其中用count_dict.items()返回字典中的key-value对的数组集,count_dict.values()返回字典中的value集 , 当然同时也有count_dict.keys()返回key集 。
(6)由于求方差的方法有两种,此程序在最后部分生成了一个百万级、打乱顺序的list,对两种求方差的方法进行测试,令人吃惊的是,万万没想到是我们愚蠢的人类最不爱用,也最难用的,最不好用的平方-期望的平方的期望,优于更好记忆的、更常用的平方的期望-期望的平方: 。。从上述的运行结果可以看出这种求方差的方法速度是的一倍!这就是聪明的计算机与愚蠢的人类的区别吧~
(7)最后,python的打印到控制台,其实你完全可以print得更好的,你不换行还要在print后面补逗号吗 , 再print一个什么东东,或者将数值用str先转字符串才能与纯正的字符串连接起来,而字符串的format方法,配合print相当于C语言的printf,同时python的format用{0},{1}...代表后面的第0、1……参数 。{0:.2f}代表这个参数以保留2位小数的方式输出 。

推荐阅读