python多峰函数 Python 峰

python数据统计分析

1. 常用函数库

专注于为中小企业提供成都做网站、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业南海免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

  scipy包中的stats模块和statsmodels包是python常用的数据分析工具,scipy.stats以前有一个models子模块,后来被移除了。这个模块被重写并成为了现在独立的statsmodels包。

 scipy的stats包含一些比较基本的工具,比如:t检验,正态性检验,卡方检验之类,statsmodels提供了更为系统的统计模型,包括线性模型,时序分析,还包含数据集,做图工具等等。

2. 小样本数据的正态性检验

(1) 用途

 夏皮罗维尔克检验法 (Shapiro-Wilk) 用于检验参数提供的一组小样本数据线是否符合正态分布,统计量越大则表示数据越符合正态分布,但是在非正态分布的小样本数据中也经常会出现较大的W值。需要查表来估计其概率。由于原假设是其符合正态分布,所以当P值小于指定显著水平时表示其不符合正态分布。

 正态性检验是数据分析的第一步,数据是否符合正态性决定了后续使用不同的分析和预测方法,当数据不符合正态性分布时,我们可以通过不同的转换方法把非正太态数据转换成正态分布后再使用相应的统计方法进行下一步操作。

(2) 示例

(3) 结果分析

 返回结果 p-value=0.029035290703177452,比指定的显著水平(一般为5%)小,则拒绝假设:x不服从正态分布。

3. 检验样本是否服务某一分布

(1) 用途

 科尔莫戈罗夫检验(Kolmogorov-Smirnov test),检验样本数据是否服从某一分布,仅适用于连续分布的检验。下例中用它检验正态分布。

(2) 示例

(3) 结果分析

 生成300个服从N(0,1)标准正态分布的随机数,在使用k-s检验该数据是否服从正态分布,提出假设:x从正态分布。最终返回的结果,p-value=0.9260909172362317,比指定的显著水平(一般为5%)大,则我们不能拒绝假设:x服从正态分布。这并不是说x服从正态分布一定是正确的,而是说没有充分的证据证明x不服从正态分布。因此我们的假设被接受,认为x服从正态分布。如果p-value小于我们指定的显著性水平,则我们可以肯定地拒绝提出的假设,认为x肯定不服从正态分布,这个拒绝是绝对正确的。

4.方差齐性检验

(1) 用途

 方差反映了一组数据与其平均值的偏离程度,方差齐性检验用以检验两组或多组数据与其平均值偏离程度是否存在差异,也是很多检验和算法的先决条件。

(2) 示例

(3) 结果分析

 返回结果 p-value=0.19337536323599344, 比指定的显著水平(假设为5%)大,认为两组数据具有方差齐性。

5. 图形描述相关性

(1) 用途

 最常用的两变量相关性分析,是用作图描述相关性,图的横轴是一个变量,纵轴是另一变量,画散点图,从图中可以直观地看到相关性的方向和强弱,线性正相关一般形成由左下到右上的图形;负面相关则是从左上到右下的图形,还有一些非线性相关也能从图中观察到。

(2) 示例

(3) 结果分析

 从图中可以看到明显的正相关趋势。

6. 正态资料的相关分析

(1) 用途

 皮尔森相关系数(Pearson correlation coefficient)是反应两变量之间线性相关程度的统计量,用它来分析正态分布的两个连续型变量之间的相关性。常用于分析自变量之间,以及自变量和因变量之间的相关性。

(2) 示例

(3) 结果分析

 返回结果的第一个值为相关系数表示线性相关程度,其取值范围在[-1,1],绝对值越接近1,说明两个变量的相关性越强,绝对值越接近0说明两个变量的相关性越差。当两个变量完全不相关时相关系数为0。第二个值为p-value,统计学上,一般当p-value0.05时,可以认为两变量存在相关性。

7. 非正态资料的相关分析

(1) 用途

 斯皮尔曼等级相关系数(Spearman’s correlation coefficient for ranked data ),它主要用于评价顺序变量间的线性相关关系,在计算过程中,只考虑变量值的顺序(rank, 值或称等级),而不考虑变量值的大小。常用于计算类型变量的相关性。

(2) 示例

(3) 结果分析

 返回结果的第一个值为相关系数表示线性相关程度,本例中correlation趋近于1表示正相关。第二个值为p-value,p-value越小,表示相关程度越显著。

8. 单样本T检验

(1) 用途

 单样本T检验,用于检验数据是否来自一致均值的总体,T检验主要是以均值为核心的检验。注意以下几种T检验都是双侧T检验。

(2) 示例

(3) 结果分析

 本例中生成了2列100行的数组,ttest_1samp的第二个参数是分别对两列估计的均值,p-value返回结果,第一列1.47820719e-06比指定的显著水平(一般为5%)小,认为差异显著,拒绝假设;第二列2.83088106e-01大于指定显著水平,不能拒绝假设:服从正态分布。

9. 两独立样本T检验

(1) 用途

 由于比较两组数据是否来自于同一正态分布的总体。注意:如果要比较的两组数据不满足方差齐性, 需要在ttest_ind()函数中添加参数equal_var = False。

(2) 示例

(3) 结果分析

 返回结果的第一个值为统计量,第二个值为p-value,pvalue=0.19313343989106416,比指定的显著水平(一般为5%)大,不能拒绝假设,两组数据来自于同一总结,两组数据之间无差异。

10. 配对样本T检验

(1) 用途

 配对样本T检验可视为单样本T检验的扩展,检验的对象由一群来自正态分布独立样本更改为二群配对样本观测值之差。它常用于比较同一受试对象处理的前后差异,或者按照某一条件进行两两配对分别给与不同处理的受试对象之间是否存在差异。

(2) 示例

(3) 结果分析

 返回结果的第一个值为统计量,第二个值为p-value,pvalue=0.80964043445811551,比指定的显著水平(一般为5%)大,不能拒绝假设。

11. 单因素方差分析

(1) 用途

 方差分析(Analysis of Variance,简称ANOVA),又称F检验,用于两个及两个以上样本均数差别的显著性检验。方差分析主要是考虑各组之间的平均数差别。

 单因素方差分析(One-wayAnova),是检验由单一因素影响的多组样本某因变量的均值是否有显著差异。

 当因变量Y是数值型,自变量X是分类值,通常的做法是按X的类别把实例成分几组,分析Y值在X的不同分组中是否存在差异。

(2) 示例

(3) 结果分析

 返回结果的第一个值为统计量,它由组间差异除以组间差异得到,上例中组间差异很大,第二个返回值p-value=6.2231520821576832e-19小于边界值(一般为0.05),拒绝原假设, 即认为以上三组数据存在统计学差异,并不能判断是哪两组之间存在差异 。只有两组数据时,效果同 stats.levene 一样。

12. 多因素方差分析

(1) 用途

 当有两个或者两个以上自变量对因变量产生影响时,可以用多因素方差分析的方法来进行分析。它不仅要考虑每个因素的主效应,还要考虑因素之间的交互效应。

(2) 示例

(3) 结果分析

 上述程序定义了公式,公式中,"~"用于隔离因变量和自变量,”+“用于分隔各个自变量, ":"表示两个自变量交互影响。从返回结果的P值可以看出,X1和X2的值组间差异不大,而组合后的T:G的组间有明显差异。

13. 卡方检验

(1) 用途

 上面介绍的T检验是参数检验,卡方检验是一种非参数检验方法。相对来说,非参数检验对数据分布的要求比较宽松,并且也不要求太大数据量。卡方检验是一种对计数资料的假设检验方法,主要是比较理论频数和实际频数的吻合程度。常用于特征选择,比如,检验男人和女人在是否患有高血压上有无区别,如果有区别,则说明性别与是否患有高血压有关,在后续分析时就需要把性别这个分类变量放入模型训练。

 基本数据有R行C列, 故通称RC列联表(contingency table), 简称RC表,它是观测数据按两个或更多属性(定性变量)分类时所列出的频数表。

(2) 示例

(3) 结果分析

 卡方检验函数的参数是列联表中的频数,返回结果第一个值为统计量值,第二个结果为p-value值,p-value=0.54543425102570975,比指定的显著水平(一般5%)大,不能拒绝原假设,即相关性不显著。第三个结果是自由度,第四个结果的数组是列联表的期望值分布。

14. 单变量统计分析

(1) 用途

 单变量统计描述是数据分析中最简单的形式,其中被分析的数据只包含一个变量,不处理原因或关系。单变量分析的主要目的是通过对数据的统计描述了解当前数据的基本情况,并找出数据的分布模型。

 单变量数据统计描述从集中趋势上看,指标有:均值,中位数,分位数,众数;从离散程度上看,指标有:极差、四分位数、方差、标准差、协方差、变异系数,从分布上看,有偏度,峰度等。需要考虑的还有极大值,极小值(数值型变量)和频数,构成比(分类或等级变量)。

 此外,还可以用统计图直观展示数据分布特征,如:柱状图、正方图、箱式图、频率多边形和饼状图。

15. 多元线性回归

(1) 用途

 多元线性回归模型(multivariable linear regression model ),因变量Y(计量资料)往往受到多个变量X的影响,多元线性回归模型用于计算各个自变量对因变量的影响程度,可以认为是对多维空间中的点做线性拟合。

(2) 示例

(3) 结果分析

 直接通过返回结果中各变量的P值与0.05比较,来判定对应的解释变量的显著性,P0.05则认为自变量具有统计学意义,从上例中可以看到收入INCOME最有显著性。

16. 逻辑回归

(1) 用途

 当因变量Y为2分类变量(或多分类变量时)可以用相应的logistic回归分析各个自变量对因变量的影响程度。

(2) 示例

(3) 结果分析

 直接通过返回结果中各变量的P值与0.05比较,来判定对应的解释变量的显著性,P0.05则认为自变量具有统计学意义。

请教一个python代码问题!

假设两个数带进去替换x和n就好理解了,比如power(2,3)计算2的3次方

按照代码

s=1 n0(我们假设了n为3)

然后执行while n0 里的n=n-1 n变成2

再执行s(这个是新的s)=s(这个是旧的s)*x 新s变为2(我们上面假设x为2)

然后返回s(下次使用时就变成了旧s)

接着判断n,依旧大于0 ,执行n=n-1 n变成1 执行s=s*x 新s变为4,然后返回s

接着判断n,依旧大于0,执行n=n-1 n变成0(意味着这次结束就将跳出循环)执行s=s*x

新s变成8

循环结束,得到结果。2的3次方是8

不知道还有什么地方不明白

python分治法求二维数组局部峰值方法

python分治法求二维数组局部峰值方法

下面小编就为大家分享一篇python分治法求二维数组局部峰值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

题目的意思大致是在一个n*m的二维数组中,找到一个局部峰值。峰值要求大于相邻的四个元素(数组边界以外视为负无穷),比如最后我们找到峰值A[j][i],则有A[j][i] A[j+1][i] A[j][i] A[j-1][i] A[j][i] A[j][i+1] A[j][i] A[j][i-1]。返回该峰值的坐标和值。

当然,最简单直接的方法就是遍历所有数组元素,判断是否为峰值,时间复杂度为O(n^2)

再优化一点求每一行(列)的最大值,再通过二分法找最大值列的峰值(具体方法可见一维数组求峰值),这种算法时间复杂度为O(logn)

这里讨论的是一种复杂度为O(n)的算法,算法思路分为以下几步:

1、找“田”字。包括外围的四条边和中间横竖两条边(图中绿色部分),比较其大小,找到最大值的位置。(图中的7)

2、找到田字中最大值后,判断它是不是局部峰值,如果是返回该坐标,如果不是,记录找到相邻四个点中最大值坐标。通过该坐标所在的象限缩小范围,继续比较下一个田字

3、当范围缩小到3*3时必定会找到局部峰值(也可能之前就找到了)

关于为什么我们选择的范围内一定存在峰值,大家可以这样想,首先我们有一个圈,我们已知有圈内至少有一个元素大于这个圈所有的元素,那么,是不是这个圈中一定有一个最大值?

可能说得有点绕,但是多想想应该能够理解,也可以用数学的反证法来证明。

算法我们理解后接下来就是代码实现了,这里我用的语言是python(初学python,可能有些用法上不够简洁请见谅),先上代码:

import numpy as np

def max_sit(*n): #返回最大元素的位置

temp = 0

sit = 0

for i in range(len(n)):

if(n[i]temp):

temp = n[i]

sit = i

return sit

def dp(s1,s2,e1,e2):

m1 = int((e1-s1)/2)+s1 #row

m2 = int((e2-s1)/2)+s2 #col

nub = e1-s1

temp = 0

sit_row = 0

sit_col = 0

for i in range(nub):

t = max_sit(list[s1][s2+i], #第一排

list[m1][s2+i], #中间排

list[e1][s2+i], #最后排

list[s1+i][s2], #第一列

list[s1+i][m2], #中间列

list[s1+i][e2], #最后列

temp)

if(t==6):

pass

elif(t==0):

temp = list[s1][s2+i]

sit_row = s1

sit_col = s2+i

elif(t==1):

temp = list[m1][s2+i]

sit_row = m1

sit_col = s2+i

elif(t==2):

temp = list[e1][s2+i]

sit_row = e1

sit_col = s2+i

elif(t==3):

temp = list[s1+i][s2]

sit_row = s1+i

sit_row = s2

elif(t==4):

temp = list[s1+i][m2]

sit_row = s1+i

sit_col = m2

elif(t==5):

temp = list[s1+i][e2]

sit_row = s1+i

sit_col = m2

t = max_sit(list[sit_row][sit_col], #中

list[sit_row-1][sit_col], #上

list[sit_row+1][sit_col], #下

list[sit_row][sit_col-1], #左

list[sit_row][sit_col+1]) #右

if(t==0):

return [sit_row-1,sit_col-1]

elif(t==1):

sit_row-=1

elif(t==2):

sit_row+=1

elif(t==3):

sit_col-=1

elif(t==4):

sit_col+=1

if(sit_rowm1):

e1 = m1

else:

s1 = m1

if(sit_colm2):

e2 = m2

else:

s2 = m2

return dp(s1,s2,e1,e2)

f = open("demo.txt","r")

list = f.read()

list = list.split("n") #对行进行切片

list = ["0 "*len(list)]+list+["0 "*len(list)] #加上下的围墙

for i in range(len(list)): #对列进行切片

list[i] = list[i].split()

list[i] = ["0"]+list[i]+["0"] #加左右的围墙

list = np.array(list).astype(np.int32)

row_n = len(list)

col_n = len(list[0])

ans_sit = dp(0,0,row_n-1,col_n-1)

print("找到峰值点位于:",ans_sit)

print("该峰值点大小为:",list[ans_sit[0]+1,ans_sit[1]+1])

f.close()

首先我的输入写在txt文本文件里,通过字符串转换变为二维数组,具体转换过程可以看我上一篇博客——python中字符串转换为二维数组。(需要注意的是如果在windows环境中split后的列表没有空尾巴,所以不用加list.pop()这句话)。有的变动是我在二维数组四周加了“0”的围墙。加围墙可以再我们判断峰值的时候不用考虑边界问题。

max_sit(*n)函数用于找到多个值中最大值的位置,返回其位置,python的内构的max函数只能返回最大值,所以还是需要自己写,*n表示不定长参数,因为我需要在比较田和十(判断峰值)都用到这个函数

def max_sit(*n): #返回最大元素的位置

temp = 0

sit = 0

for i in range(len(n)):

if(n[i]temp):

temp = n[i]

sit = i

return sit

dp(s1,s2,e1,e2)函数中四个参数的分别可看为startx,starty,endx,endy。即我们查找范围左上角和右下角的坐标值。

m1,m2分别是row 和col的中间值,也就是田字的中间。

def dp(s1,s2,e1,e2):

m1 = int((e1-s1)/2)+s1 #row

m2 = int((e2-s1)/2)+s2 #col

依次比较3行3列中的值找到最大值,注意这里要求二维数组为正方形,如果为矩形需要做调整

for i in range(nub):

t = max_sit(list[s1][s2+i], #第一排

list[m1][s2+i], #中间排

list[e1][s2+i], #最后排

list[s1+i][s2], #第一列

list[s1+i][m2], #中间列

list[s1+i][e2], #最后列

temp)

if(t==6):

pass

elif(t==0):

temp = list[s1][s2+i]

sit_row = s1

sit_col = s2+i

elif(t==1):

temp = list[m1][s2+i]

sit_row = m1

sit_col = s2+i

elif(t==2):

temp = list[e1][s2+i]

sit_row = e1

sit_col = s2+i

elif(t==3):

temp = list[s1+i][s2]

sit_row = s1+i

sit_row = s2

elif(t==4):

temp = list[s1+i][m2]

sit_row = s1+i

sit_row = m2

elif(t==5):

temp = list[s1+i][e2]

sit_row = s1+i

sit_row = m2

判断田字中最大值是不是峰值,并找不出相邻最大值

t = max_sit(list[sit_row][sit_col], #中

list[sit_row-1][sit_col], #上

list[sit_row+1][sit_col], #下

list[sit_row][sit_col-1], #左

list[sit_row][sit_col+1]) #右

if(t==0):

return [sit_row-1,sit_col-1]

elif(t==1):

sit_row-=1

elif(t==2):

sit_row+=1

elif(t==3):

sit_col-=1

elif(t==4):

sit_col+=1

缩小范围,递归求解

if(sit_rowm1):

e1 = m1

else:

s1 = m1

if(sit_colm2):

e2 = m2

else:

s2 = m2

return dp(s1,s2,e1,e2)

好了,到这里代码基本分析完了。如果还有不清楚的地方欢迎下方留言。

除了这种算法外,我也写一种贪心算法来求解这道题,只可惜最坏的情况下算法复杂度还是O(n^2),QAQ。

大体的思路就是从中间位置起找相邻4个点中最大的点,继续把该点来找相邻最大点,最后一定会找到一个峰值点,有兴趣的可以看一下,上代码:

#!/usr/bin/python3

def dp(n):

temp = (str[n],str[n-9],str[n-1],str[n+1],str[n+9]) #中 上 左 右 下

sit = temp.index(max(temp))

if(sit==0):

return str[n]

elif(sit==1):

return dp(n-9)

elif(sit==2):

return dp(n-1)

elif(sit==3):

return dp(n+1)

else:

return dp(n+9)

f = open("/home/nancy/桌面/demo.txt","r")

list = f.read()

list = list.replace(" ","").split() #转换为列表

row = len(list)

col = len(list[0])

str="0"*(col+3)

for x in list: #加围墙 二维变一维

str+=x+"00"

str+="0"*(col+1)

mid = int(len(str)/2)

print(str,mid)

p = dp(mid)

print (p)

f.close()

以上这篇python分治法求二维数组局部峰值方法就是小编分享给大家的全部内容了,希望能给大家一个参考

在python里有峰值谷值提取算法吗

峰值就是一堆数值中的最大值或者最小值吧,你可以使用max和min函数。

l=[1,4,5,6,74,23,2,1,5,7]

print max(l)

print min(l)


文章题目:python多峰函数 Python 峰
新闻来源:http://scyanting.com/article/hjihie.html