-
2021-07-27 01:20:27
四分位差(quartile deviation),也称为内距或四分间距(inter-quartile range),它是上四分位数(QU,即位于75%)与下四分位数(QL,即位于25%)的差。计算公式.
将所有数值按大小顺序排列并分成四等份,处于三个分割点位置的得分就是四分位数。最小的四分位数称为下四分位数,所有数值中,有四分之一小于下四分位数,四分之.
把一个数组从小到大排序,中位数是中间那个数上四分位数是排在1/4的那个数下四分位数是排在3/4的那个数如果用EXCEL计算($A$1:$A$9为数列)最小值=QUARTILE.
哪位大神可以给我详细说一下4分位数的具体求法。。我举一个例子。。这里。
四分位数(Quartile),即统计学中,把所有数值由小到大排列并分成四等份,处于三个分割点位置的得分就是四分位数。第一四分位数 (Q1),又称“较小四分位数”,.
有一个函数是专门求四分位数的。=quartile(a1:a10,1)
四分位数和中位数是同一类的概念,将一组数据按大小顺序排列后,按数据的个数分成四份,而这三个分割点上的数值,就称四分位数,具体分别称为:第1四分位数,第2.
统计学中,把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由.
晕死,这个貌似不是佛法,是财务方法吧。——你看这样解释对不对?——四分位法是zhidao统计学的一种分析方法。简单地说,就是将全部数据从小到大排列,正好排 列.
众数从=10中位数=10.5下四分位数=9.25上四分位数=13.5平均数=11.1667标准差=2.7579
如题,是一个数字,比如10,还是一个范围,比如2-12?怎么求中四分位范围。
四分位数是将全部数据分成相等的四部分,其中每部分包括25%的数据,处在各分位点的数值就是四分位数。 四分位数作为分位数的一种形式,在统计中有着十分重要的.
要计算过程,怎么算出来的?
从小到大排序:17,19,20,22,23,23,,24,25 下四分位数等于该样本中所有数值由小到大排列后第25%的数字,即第2个数19。上四分位数等于该样本中所有数值由小到大排列.
四分位数(Quartile),即统计学中,把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。 第一四分位数 (Q1),又称“较小四分位数”.
4分位数有两个25%和75%把一组数据按照大小的顺序排列其中前者的求法是,这个数的前面占全部数据的25%后者是这个数的前面占全部数据的75%
1/4的我知道,3/4怎么算
使用excel中quartile的函数.语法(array,quart).参数array为需要求得四分位数值的数组或数字引用区域,quart决定返回哪个四分位值.如果quart取0,1,2,3或4则函数quartile返.
四分位差是上四分位数与下四分位数之差,也称为内距或四分间距。它主要用于测度顺序数据的离散程度。当然对于数值型数据也可以计算四分位差,但它不适合于分类数.
lz你好IQR = Q3 ? Q1 四分位距通常是用来构建箱形图,以及对概率分布的简要图表概述。对一个对称性分布数据(其中位数必然等于第三四分位数与第一四分位数的算术.
75、85、87、95、99、100、101、105、113、115、125 第一个四分位数:。
75 85 87 |95 99、100、101 105 | 113 115 125 分4段,100为中点 Q1=(87+95)/2=91 Q2=100 Q3=(105+113)/2=109 四分位数:将所有数值按大小顺序排列并分成四等份,.
嗯,最好举例说一下说得明了一点,用话自己的话解释一下,容易看懂一些各。
英语是quartile? 你要问的是lower quartile和 upper quartile?将所有的样本从小到大排列,并分成四等份,处于三个分割点位置(是一个数值)的得分就是四分位数。最小.
下四分位数怎么求啊还有upper extreme和 lower extreme 怎么求,本人在美国。
四分位数(Quartile),即统计学中,把所有数值由小到大排列并分成四等份,处于三个分割点位置的得分就是四分位数。 第一四分位数 (Q1),又称“较小四分位数”,.
更多相关内容 -
SQL笔面试题:如何求取中位数?
2021-08-19 00:32:34公众号后台回复“图书“,了解更多号主新书内容 作者:胖里 来源: 胖里的日常 先来看看中位数的概念。中位数(Median)又称中值,统计学中的专有名词,是按顺序排...公众号后台回复“图书“,了解更多号主新书内容 作者:胖里 来源: 胖里的日常
先来看看中位数的概念。
中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
百度百科
说到中位数,大家应该都不陌生。中位数是九年义务教育中数学里的一个重要概念,想当初刚学习的时候会经常对平均数、中位数、众数进行比较,比较它们的优缺点是什么,什么情况下应该用哪一种数。
不知道大家日常数据分析工作中是否会用到中位数的求取,如果是通过Excel、Python等进行数据分析、可视化展示,那这两款软件都有其对应的求中位数的函数,分别是median()和numpy库中的median()。如果写SQL的时候用到,可能就没有那么现成的函数了。(oracle中有求取中位数的函数)
除了日常工作,数据分析的笔面试中也经常会出现中位数求取的考察。今天就总结三种用SQL求取中位数的方法。
方法1:充分利用窗口函数
思路介绍:
根据中位数的概念,想要求取中位数,需要对一组数据进行排序,找出居于中间位置的数,如果有奇数个数,那最中间的一个为中位数,如果有偶数个数,那中间两个数的平均数为中位数。因此我们需要实现的是排序,取中间值或中间两值的平均值,既然涉及到中间这种位置定位,那自然少不了编号与总体个数的比较。
因此可以概括为排序、编号、找位置、取值。那就需要考虑到排序函数row_number()、计数函数cout()、求均值函数avg()。
示例:
有一组数:1,3,55,8,34,66,42,88,SQL找出中位数。
按照先前的思路,使用相关函数实现:
select avg(num) from ( select num ,row_number() over(order by num) as rn ,count(*) over() as n from tmp )as t where rn in (floor(n/2)+1,if(mod(n,2) = 0,floor(n/2),floor(n/2)+1))
先使用row_number()函数对数据从小到大进行排序标号,用count()顺便实现数据总数的记录,假设为n个。如果n为奇数,则取最中间一个值作为中位数,也就是编号为floor(n/2)+1的数,如果n为偶数,需要取中间位置的两个数,也就是floor(n/2)和floor(n/2)+1的两个数。因此可以将floor(n/2)+1作为一个rn的取值,另一个通过判断奇偶性来选择。
当然思路一致,你选择不同的函数实现也是可以的,比如不用if用case when来判断。
方法2:正排倒排来一遍法
思路介绍:
不妨这样想一想,还是根据中位数的概念,一组数据想求中位数,那么这个数或这两个数肯定在一组排序好的数据的中间位置,那是不是正排和倒排的编号会存在某种规律?
假设有一组数:33,25,4,63,18(奇数个),正排和倒排编号之后如下。
假设还有一组数:33,25,4,63,18,22(偶数个),正排和倒排编号之后如下。
观察上述两个示例,会发现由于中位数的独特魅力所在,无论正排还是倒排,对于奇数个数来说,其编号始终不变,而对于偶数个数来说,两个中位数(取均值)的编号相差±1。
按照上述观察结果,就可以得到另一种求中位数的思路,也就是对数据进行正排和倒排,编号,按照奇偶两种条件进行限制,求得编号是这两种条件的一个值或两个值的平均数作为中位数。
示例:
有一组数:1,3,55,8,34,66,42,88,SQL找出中位数。
按照先前的思路,使用相关函数实现:
select avg(num) from ( select num ,row_number() over(order by num) as rn1 ,row_number() over(order by num desc) as rn2 from tmp )as t where rn1 = rn2 or abs(rn1-rn2) = 1
此处需要注意一个问题,上述SQL代码用MySQL跑时,会报错,需要设置下参数,SET sql_mode='NO_UNSIGNED_SUBTRACTION'。
还有,我们不得不考虑这样一种情况,如果待求中位数的数据中存在相等的数怎么办?比如下图的示例,出现了多个重复数据,对于相同的值使用row_number()函数可能不能实现像我们预期那样的正排倒排,此时若按照rn1 = rn2或abs(rn1 - rn2)相差1这两个条件进行限制只能得到6,但实际上中位数为2和6的平均数。
因此为了达到预期想要的正排倒排的效果,可以使用主键id跟着要排序的数据进行正排倒排,保证正排和倒排数据的编号走向处处相反。
select avg(num) from ( select id ,num ,row_number() over(order by num, id) as rn1 ,row_number() over(order by num desc, id desc) as rn2 from tmp )as t where rn1 = rn2 or abs(rn1-rn2) = 1
难道求中位数只能通过排序?不排序可以找到中位数吗?我们来看看方法三。
方法三:自连接比较法
思路介绍:
我们可以想一想,除了被动排序编号,这些数据是不是可以主动一把?一个数A可以主动去跟别的数作比较,如果比别的数小则+1,比别的数大则-1,这+1,-1加和是不是能表示这个数的“地位”,也就是变相的表征如果按大小排序,是排在什么样的位置上。是不是也就意味着+1,-1加和得到的结果(绝对值)越小,这个数越处于居中位置?
举个例子。
有这么一组数据:1,2,3,4,5,6。按照刚刚描述,对它们分别求取一个加和结果margin和margin的绝对值。
从图上可以看到,3和4对应的margin的绝对值最小,因此它们两个就是居中的数。通过这个例子是否能get此方法?是否能得到某个处于中间位置的值,或某两个处于中间位置的值?
当然上述示例比较简单,再多考虑一下,这种操作对于有重复值的适用吗?
我们看图中这个示例,数据中存在多个重复值,按刚刚的思路,margin绝对值最小的num即为中位数,但此示例中显然不是,2和6的均值才是中位数。
此时要想沿用之前的思路,就得加限制条件,也就是统计下与该数相等的数的个数,记为equal,毕竟个数会影响到num的位置。选出equal大于或等于margin绝对值的num,也就是2和6。
按照目前的思路,使用相关语句实现:
select avg(num) from ( select t1.num ,abs(sum(sign(t2.num-t1.num))) as margin ,sum(if(t1.num = t2.num,1,0)) as equal from ( select num from tmp )as t1 inner join ( select num from tmp )as t2 group by t1.num )as t where equal >= margin
以上便是我今天分享的三种使用SQL进行中位数求取的方法。当然大家也可以考虑下是否存在某些现成的计算分位数的函数,毕竟中位数就是二分位数,直接使用函数可比写SQL来的容易。如此看来,此考题的目的就是考你对于中位数的理解,考你的思路和方法了。
至于与中位数相关的笔试题目我这边就不做赘述了,大家可以去网站上搜搜看,有类似的题目,现实中也有相关应用。比如求各科成绩的中位数、各部门员工薪资的中位数等等。实例有很多,可以自己结合现成函数或上述方法操作看看。
如果你有更好地求中位数的方法或文中有何不妥之处,欢迎交流~可以通过
◆ ◆ ◆ ◆ ◆ 麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。 管理员二维码: 猜你喜欢 ● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜 ● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗
-
张晓峒分位数回归讲义解析.doc
2021-01-17 16:51:44以一元回归为例,如果用LAD法估计的中位数回归回归yt的分布是非对称的。如果散点图上侧分位数回归直线之间与下侧分位数回归直线之间相比,相互比较接近,则说明被解释变量yt的分布是左偏倚的。反之是右偏倚的。对于...第15章 分位数回归模型
15.1 总体分位数位数
15.位数的估计
.3 分位数回归
.4 分位数回归模型的估计
.5 分位数回归模型的
15.6 分位数的计算分位数回归的
15.7 分位数回归的
以往回归模型是研究被解释变量的条件期望。人们解释变量被解释变量分布的。就是分位数回归,它最早由Koenker和Bassett(1978)提出,是估计一回归变量X与被解释变量Y的分位数之间线性关系的建模方法。正如普通最小二乘OLS回归估计量的计算是基于残差平方一样,分位数回归估计量的计算是基于一种非对称形式的绝对值残差,,中位数回归运用的是最小绝对值离差估计(LADleast absolute deviations estimator)。它和OLS主要区别在于数估计方法和渐近分布的估计在残差检验、数检验、模型设定、预测等方面基本相同。
分位数回归的优点是,能够更加全面的描述被解释变量条件分布的全貌,而不是仅仅分析被解释变量条件期望均值,可以分析解释变量如何影响被解释变量的中位数、分位数等。不同分位数下的数估计量不同,即解释变量对不同水平被解释变量的影响不同。另外,中位数回归与最小二乘法相比,对离群值表现的更加稳健且,分位数回归并不要求很强的假设条件,因此对于分布分位数回归数估计更加稳健。15.1 总体分位数位数
分位数位数对一个连续随机变量y,其总体τ分位数是τ)的义是:y小于等于τ)的概率是τ即
τ = P( y ≤ y(τ)) = F(y(τ))
其中PF(y(τ)) 表示y的累积分布函数(cdf)。比如0.25) = 3,意味着y ≤ 3的概率是0.5。且有
τ) = F-1(y(τ))
即F(y(τ))的反函数是y(τ)。当τ=0.5时τ) 是y的中位数τ= 0.75时τ) 是y的第3/4分位数,τ= 0.25时τ) 是y的第1/4分位数。正态分布,0.5) = 0,0.95) =1.645,0.975) =1.960。
另外,如果随机变量的分布是对称的,那么均值与中位数是相同的。当中位数小于均值,分布是右偏的反之分布是左偏的。
对于回归模型,被解释变量yt对X为条件的τ分位数用函数τ)t(X表示,其含义是:以X为条件的yt小于等于τ)t(X的概率是τ这里的概率是用yt对X的条件分布计算的。且有
τ)t(X = F-1(y(τ)t(X)
其中F(τ)t(X) 是yt给定X的累积概率分布函数(cdf)。则τ)t(X称作被解释变量yt对X的条件分位数函数。而F '(τ)t(X)= f (y(τ)t(X)则称作分位数概率密度函数。其中F'(τ)t(X)表示F(y(τ)t(X)对y(τ)t(X求导。
15.2 总体中位数的估计
y表示,其概率密度函数用f(y)表示,累计概率密度函数用F(y)表示,y的中位数用y(0.5)表示,则y与任一值(的离差绝对值的期望以( = y(0.5) 时为最小。
证明:
=
= (15.1)
根据莱布尼兹公式,若,则有。令,则有。运用于式(15.1),得
==
=
式(15.1)求极小的一阶条件是= 0,即=0,。这意味着(等于中位数y0.5)。
( = y(0.5)
与定理15.1等价的表述是以( = y(0.5)(中位数)时为最小。因此,中位数回归yt = X (( + ut,通过求最小,估计(的中位数回归,从而得到yt的中位数回归。
15.3 分位数回归
Koenker和Bassett(1978)表示yt的分位数回归yt 对任意值(的加权离差绝对值和只有在( =时取得最小值。其中
= (15.2)
(((0, 1)。据此,分位数回归yt = X (( + ut, 求第(分位数回归的方法是求下式(目标函数)最小,
(15.3)
其中表示第(分位数回归位数回归=
其中X,(都是k(1阶列向量。称作分位数回归
=称作中位数回归称作中位数回归数位数回归位数回归。
-
对一个样本,估计的分位数回归yt条件分布的理解就越充分。以一元回归为例,如果用LAD法估计的中位数回归回归yt的分布是非对称的。如果散点图上侧分位数回归直线之间与下侧分位数回归直线之间相比,相互比较接近,则说明被解释变量yt的分布是左偏倚的。反之是右偏倚的。对于不同分位数回归函数如果回归系数的差异很大,说明在不同分位数上解释变量对被解释变量
-
【缺失值处理】拉格朗日插值法—随机森林算法填充—sklearn填充(均值/众数/中位数)
2020-09-15 00:24:18不可忽略的缺失或非随机缺失,如果不完全变量中数据的缺失既依赖于完全变量又依赖于不完全变量本身,这种缺失即为不可忽略的缺失。 缺失值的处理 不处理 删除存在缺失值的样本(或特征) 缺失值插补 使用泰坦尼克...文章目录
在进行缺失值填充之前,要先对缺失的变量进行业务上的了解,即变量的含义、获取方式、计算逻辑,以便知道该变量为什么会出现缺失值、缺失值代表什么含义。
缺失值的处理
对于缺失值的处理,从总体上来说分为删除存在缺失值的个案和缺失值插补。
- 不处理
- 删除存在缺失值的样本(或特征)
- 缺失值插补
这里可以阅读以下《美团机器学习实战》中关于缺失值的说明:
一般主观数据不推荐插补的方法,插补主要是针对客观数据,它的可靠性有保证。
附上常用的插补方法
准备数据
使用泰坦尼克数据集:
import seaborn as sns # 导出泰坦尼克数据集 df = sns.load_dataset('titanic') df.shape # 891, 15) df.info()
数据字段含义网上有解释可能会存在样本重复,即有超过一行的样本所显示的所有特征都一样
#去除重复值 df.drop_duplicates(inplace=True) df.shape #恢复索引 df.index = range(df.shape[0])
缺失情况
df.isnull().sum() ''' survived 0 pclass 0 sex 0 age 177 sibsp 0 parch 0 fare 0 embarked 2 class 0 who 0 adult_male 0 deck 688 embark_town 2 alive 0 alone 0 dtype: int64 '''
缺失占比
df.isna().mean() ''' survived 0.000000 pclass 0.000000 sex 0.000000 age 0.198653 sibsp 0.000000 parch 0.000000 fare 0.000000 embarked 0.002245 class 0.000000 who 0.000000 adult_male 0.000000 deck 0.772166 embark_town 0.002245 alive 0.000000 alone 0.000000 dtype: float64 '''
1 sklearn填充
在sklearn当中,使用
impute.SimpleImputerr
来处理缺失值,参数为sklearn.impute.SimpleImputer ( missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True)
参数 含义 missing_values 数据中缺失值是什么,默认np.nan strategy 填补缺失值的策略,默认均值
输入“mean”使用均值填补(仅对数值型特征可用)
输入“median”使用中位数填补(仅对数值型特征可用)
输入“most_frequent”使用众数填补(对数值型和字符型特征都可用)
输入“constant”表示请参考参数“fill_value”中的值(对数值型和字符型特征都可用)fill_value 当参数strategy为“constant”的时候可用,可输入字符串或数字表示要填充的值,常用0 copy 默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中。
传统地,
- 如果是分类型特征,采用众数进行填补。
- 如果是连续型特征,采用均值进行填补。
还要考虑
- 均值一般适用于近似正态分布数据,观测值较为均匀散布均值周围;
- 中位数一般适用于偏态分布或者有离群点数据,中位数是更好地代表数据中心趋势;
- 众数一般用于类别变量,无大小、先后顺序之分。
在现实工作时,使用最多的是易于理解的均值或者中位数。
(1)使用均值进行填补(连续型特征)
import numpy as np import pandas as pd # 去掉标签 X_missing = df.drop(['survived'],axis=1) # 查看缺失情况 missing = X_missing.isna().sum() missing = pd.DataFrame(data={'特征': missing.index,'缺失值个数':missing.values}) #通过~取反,选取不包含数字0的行 missing = missing[~missing['缺失值个数'].isin([0])] # 缺失比例 missing['缺失比例'] = missing['缺失值个数']/X_missing.shape[0] missing ''' 特征 缺失值个数 缺失比例 2 age 177 0.198653 6 embarked 2 0.002245 10 deck 688 0.772166 11 embark_town 2 0.002245 ''' # 排序 missing.sort_values(by='缺失比例',ascending=False) #柱形图可视化 import matplotlib.pyplot as plt import numpy as np import pylab as pl fig = plt.figure(figsize=(18,6)) plt.bar(np.arange(missing.shape[0]), list(missing['缺失比例'].values), align = 'center',color=['red','green','yellow','steelblue']) plt.title('Histogram of missing value of variables') plt.xlabel('variables names') plt.ylabel('missing rate') # 添加x轴标签,并旋转90度 plt.xticks(np.arange(missing.shape[0]),list(missing['特征'])) pl.xticks(rotation=90) # 添加数值显示 for x,y in enumerate(list(missing['缺失比例'].values)): plt.text(x,y+0.12,'{:.2%}'.format(y),ha='center',rotation=90) plt.ylim([0,1.2]) plt.show()
X_missing[missing['特征']].info() ''' RangeIndex: 891 entries, 0 to 890 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 age 714 non-null float64 1 embarked 889 non-null object 2 deck 203 non-null category 3 embark_town 889 non-null object ''' X_missing['embarked'].unique() # array(['S', 'C', 'Q', nan], dtype=object) X_missing['deck'].unique() # [NaN, C, E, G, D, A, B, F] X_missing['embark_town'].unique() # array(['Southampton', 'Cherbourg', 'Queenstown', nan], dtype=object)
deck 列缺失比例达到77%,这里考虑直接删除该列
X_missing.drop(['deck'],axis=1,inplace=True)
# 把各个类型 分离出来 方便采用不同的填补方法 # 数值型(即数据类型为int、float的列) X_missing[missing['特征']].select_dtypes(include='number').columns # 除数据类型为number外其他的列 X_missing[missing['特征']].select_dtypes(exclude='number').columns # X_missing[missing['特征']].select_dtypes(include='object').columns X_missing[missing['特征']].select_dtypes(include=['int', 'datetime', 'object']).columns
使用均值进行填补,仅对数值型特征可用,这里对age进行填补
#填补年龄 Age = X_missing.loc[:,"age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维 from sklearn.impute import SimpleImputer imp_mean = SimpleImputer() #实例化,默认均值填补 #imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') imp_mean = imp_mean.fit_transform(Age) #fit_transform一步完成调取结果 X_missing.loc[:,"age"] = imp_mean X_missing.info() ''' # Column Non-Null Count Dtype --- ------ -------------- ----- 0 pclass 891 non-null int64 1 sex 891 non-null object 2 age 891 non-null float64 3 sibsp 891 non-null int64 4 parch 891 non-null int64 5 fare 891 non-null float64 6 embarked 889 non-null object 7 class 891 non-null category 8 who 891 non-null object 9 adult_male 891 non-null bool 10 embark_town 889 non-null object 11 alive 891 non-null object 12 alone 891 non-null bool '''
(2)使用中位数、0进行填补(连续型特征)
也可以用中位数填补或用0填补
imp_median = SimpleImputer() #实例化 imp_median = SimpleImputer(strategy="median") #用中位数填补 imp_median = imp_median.fit_transform(Age) imp_0 = SimpleImputer() #实例化 imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补 imp_0 = imp_0.fit_transform(Age)
最需要注意的一点是SimpleImputer传入的参数至少要是二维,如果将直接索引出的一列特征传入的话,是会发生报错的,所以必须利用reshape()将一维转化为二维。之后的操作就是先实例化、然后训练模型,最后用填充后的数据覆盖之前的数据。
(3)使用众数进行填补(离散型特征)
使用众数填补embarked、embark_town
# 查看缺失情况 missing = X_missing.isna().sum() missing = pd.DataFrame(data={'特征': missing.index,'缺失值个数':missing.values}) #通过~取反,选取不包含数字0的行 missing = missing[~missing['缺失值个数'].isin([0])] # 缺失比例 missing['缺失比例'] = missing['缺失值个数']/X_missing.shape[0] missing ''' 特征 缺失值个数 缺失比例 6 embarked 2 0.002245 10 embark_town 2 0.002245 ''' X_missing['embarked'].unique() # array(['S', 'C', 'Q', nan], dtype=object) X_missing['embark_town'].unique() # array(['Southampton', 'Cherbourg', 'Queenstown', nan], dtype=object)
imp_most = SimpleImputer() #实例化 imp_most = SimpleImputer(strategy = "most_frequent") X_missing[missing['特征']] = imp_most.fit_transform(X_missing[missing['特征']]) X_missing.isnull().sum() ''' pclass 0 sex 0 age 0 sibsp 0 parch 0 fare 0 embarked 0 class 0 who 0 adult_male 0 embark_town 0 alive 0 alone 0 dtype: int64 '''
SimpleImputer优于fillna()之处在于前者可以一行语句指定填充值的形式,而利用fillna()需要多行重复语句才能实现,或者需要提前计算某列的平均值、中位数或者众数。
比如,用fillna()填充
# 用中位数填充 X_missing.loc[:,"age"] = X_missing.loc[:,"age"].fillna(X_missing.loc[:,"age"].median()) 或者更一般的 # 均值填充 data['col'] = data['col'].fillna(data['col'].means()) # 中位数填充 data['col'] = data['col'].fillna(data['col'].median()) # 众数填充 data['col'] = data['col'].fillna(stats.mode(data['col'])[0][0])
(4)KNN填补
官网:https://scikit-learn.org/stable/modules/generated/sklearn.impute.KNNImputer.html
使用sklearn的impute 模块中的KNNImputer 函数。KNNImputer通过欧几里德距离矩阵寻找最近邻,帮助估算观测中出现的缺失值。
每个样本的缺失值都是使用n_neighbors训练集中找到的最近邻的平均值估算的 。如果两个都不缺失的特征都接近,则两个样本接近。
class sklearn.impute.KNNImputer(*, missing_values=nan, n_neighbors=5, weights='uniform', metric='nan_euclidean', copy=True, add_indicator=False)
import numpy as np from sklearn.impute import KNNImputer X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]] imputer = KNNImputer(n_neighbors=2) imputer.fit_transform(X) ''' array([[1. , 2. , 4. ], [3. , 4. , 3. ], [5.5, 6. , 5. ], [8. , 8. , 7. ]]) '''
# 对于离散数据 data = [['a1',12,'M'],['a2',10,np.nan],['a3',14,'F'],['a4',8,'M'],['a5',7,'F'] ,['a6',20,'F'],['a7',7,'M']] df = pd.DataFrame(data,columns=['name','age','gender']) ''' name age gender 0 a1 12 M 1 a2 10 NaN 2 a3 14 F 3 a4 8 M 4 a5 7 F 5 a6 20 F 6 a7 7 M ''' # 将离散数据转化为数值型 df['gender_map'] = df.gender.map({'F':1,'M':0}) df ''' name age gender gender_map 0 a1 12 M 0.0 1 a2 10 NaN NaN 2 a3 14 F 1.0 3 a4 8 M 0.0 4 a5 7 F 1.0 5 a6 20 F 1.0 6 a7 7 M 0.0 ''' df_fill = df[['age','gender_map']] ''' age gender_map 0 12 0.0 1 10 NaN 2 14 1.0 3 8 0.0 4 7 1.0 5 20 1.0 6 7 0.0 ''' # 填补 from sklearn.impute import KNNImputer impute = KNNImputer(n_neighbors = 2) df_filled = impute.fit_transform(df_fill) df_filled ''' array([[12., 0.], [10., 0.], [14., 1.], [ 8., 0.], [ 7., 1.], [20., 1.], [ 7., 0.]]) '''
另外,还有其他的实现KNN填充方式
利用knn算法填充,其实是把目标列当做目标标量,利用非缺失的数据进行knn算法拟合,最后对目标列缺失进行预测。(对于连续特征一般是加权平均,对于离散特征一般是加权投票)
fancyimpute 类
from fancyimpute import KNN fill_knn = KNN(k=3).fit_transform(data) data = pd.DataFrame(fill_knn)
sklearn类
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor def knn_filled_func(x_train, y_train, test, k = 3, dispersed = True): # params: x_train 为目标列不含缺失值的数据(不包括目标列) # params: y_train 为不含缺失值的目标列 # params: test 为目标列为缺失值的数据(不包括目标列) if dispersed: knn= KNeighborsClassifier(n_neighbors = k, weights = "distance") else: knn= KNeighborsRegressor(n_neighbors = k, weights = "distance") knn.fit(x_train, y_train) return test.index, knn.predict(test)
2 随机森林回归进行填补
现实中,很少用算法(如随机森林)填补缺失值,因为算法填补很慢,不如均值或者0。另外,算法插补方法,领导不一定能理解,造成不必要的麻烦。
具体的
在现实中,其实非常少用到算法来进行填补,有以下几个理由:
- 算法是黑箱,解释性不强。如果你是一个数据挖掘工程师,你使用算法来填补缺失值后,你不懂机器学习的老板或者同事问你的缺失值是怎么来的,你可能需要从头到尾帮他/她把随机森林解释一遍,这种效率过低的事情是不可能做的,而许多老板和上级不会接受他们无法理解的东西。
- 算法填补太过缓慢,运行–次森林需要有至少100棵树才能够基本保证森林的稳定性,而填补一个列就需要很长的时间。在我们并不知道森林的填补结果是好是坏的情况下,填补一个很大的数据集风险非常高,有可能需要跑好几个小时,但填补出来的结果却不怎么优秀,这明显是–个低效的方法。
但这种方法还是值得学习的
随机森林插补法原理
对于一个有n个特征的数据来说,其中特征T有缺失值,我们就把特征T当作标签,其他的
n-1个特征 + 原本的标签 = 新的特征矩阵
那对于T来说,它没有缺失的部分,就是我们的 Y_train,这部分数据既有标签也有特征,而它缺失的部分,只有特征没有标签,就是我们需要预测的部分。
特征T不缺失的值对应的其他n-1个特征 + 本来的标签:X_train
特征T不缺失的值:Y_train特征T缺失的值对应的其他n-1个特征 + 本来的标签:X_test
特征T缺失的值:未知,我们需要预测的 Y_test那如果数据中除了特征T之外,其他特征也有缺失值怎么办?
答案是遍历所有的特征,从缺失最少的开始进行填补(因为填补缺失最少的特征所需要的准确信息最少)。填补一个特征时,先将其他特征的缺失值用0代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征。每一次填补完毕,有缺失值的特征会减少一个,所以每次循环后,需要用0来填补的特征就越来越少。当进行到最后一个特征时(这个特征应该是所有特征中缺失值最多的),已经没有任何的其他特征需要用0来进行填补了,而我们已经使用回归为其他特征填补了大量有效信息,可以用来填补缺失最多的特征。遍历所有的特征后,数据就完整,不再有缺失值了。
代码
换一个数据集
(1)构造缺失数据集
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_boston from sklearn.impute import SimpleImputer from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score dataset = load_boston() # 总共506*13=6578个数据,不含缺失值 # 完整的数据 X_full, y_full = dataset.data, dataset.target n_samples = X_full.shape[0] # 样本 506 n_features = X_full.shape[1] # 特征 13 rng = np.random.RandomState(0) # 种子 # 缺失率为0.2,即构造的缺失值占20% missing_rate = 0.2 n_missing_samples = int(np.floor(n_samples * n_features * missing_rate)) # 缺失值索引 missing_col_index = rng.randint(0,n_features,n_missing_samples) missing_row_index = rng.randint(0,n_samples,n_missing_samples) X_missing = X_full.copy() y_missing = y_full.copy() # 替换,构造缺失值数据集 X_missing[missing_row_index,missing_col_index] = np.nan X_missing = pd.DataFrame(X_missing,columns=dataset.feature_names)
用随机森林回归来填补缺失值
X_missing_reg = X_missing.copy() # 查看缺失情况 missing = X_missing_reg .isna().sum() missing = pd.DataFrame(data={'特征': missing.index,'缺失值个数':missing.values}) #通过~取反,选取不包含数字0的行 missing = missing[~missing['缺失值个数'].isin([0])] # 缺失比例 missing['缺失比例'] = missing['缺失值个数']/X_missing_reg .shape[0] missing ''' 特征 缺失值个数 缺失比例 0 CRIM 91 0.179842 1 ZN 88 0.173913 2 INDUS 93 0.183794 3 CHAS 109 0.215415 4 NOX 96 0.189723 5 RM 100 0.197628 6 AGE 93 0.183794 7 DIS 85 0.167984 8 RAD 87 0.171937 9 TAX 92 0.181818 10 PTRATIO 88 0.173913 11 B 93 0.183794 12 LSTAT 88 0.173913 ''' X_df = X_missing_reg.isnull().sum() # 得出列名 缺失值最少的列名 到 缺失值最多的列名 colname= X_df[~X_df.isin([0])].sort_values().index.values # 缺失值从小到大的特征顺序 sortindex =[] for i in colname: sortindex .append(X_missing_reg.columns.tolist().index(str(i))) # 遍历所有的特征,从缺失最少的开始进行填补,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征 for i in sortindex: #构建我们的新特征矩阵和新标签 df = X_missing_reg # 充当中间数据集 fillc = df.iloc[:,i] # 缺失值最少的特征列 # 除了第 i 特征列,剩下的特征列+原有的完整标签 = 新的特征矩阵 df = pd.concat([df.drop(df.columns[i],axis=1),pd.DataFrame(y_full)],axis=1) #在新特征矩阵中,对含有缺失值的列,进行0的填补 ,没循环一次,用0填充的列越来越少 df_0 =SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df) #找出训练集和测试集 # 标签 Ytrain = fillc[fillc.notnull()] # 没有缺失的部分,就是 Y_train Ytest = fillc[fillc.isnull()] # 不是需要Ytest的值,而是Ytest的索引 # 特征矩阵 Xtrain = df_0[Ytrain.index,:] Xtest = df_0[Ytest.index,:] # 有缺失值的特征情况 rfc = RandomForestRegressor(n_estimators=100) # 实例化 rfc = rfc.fit(Xtrain, Ytrain) # 训练 Ypredict = rfc.predict(Xtest) # 预测结果,就是要填补缺失值的值 #将填补好的特征返回到我们的原始的特征矩阵中 X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),X_missing_reg.columns[i]] = Ypredict # 最后,再次查看缺失值是否全部被替换 missing2 = X_missing_reg.isna().sum() missing2 = pd.DataFrame(data={'列名': missing2.index,'缺失值个数':missing2.values}) #通过~取反,选取不包含数字0的行 missing2[~missing2['缺失值个数'].isin([0])] ... Empty DataFrame Columns: [列名, 缺失值个数] Index: [] ...
均值/0/随机森林填补——三种方法效果对比
(1)使用均值进行填补 #使用均值进行填补 from sklearn.impute import SimpleImputer imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') X_missing_mean = imp_mean.fit_transform(X_missing) (2)使用 0 进行填补 #使用0进行填补 imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant",fill_value=0) X_missing_0 = imp_0.fit_transform(X_missing)
对比
X = [X_full,X_missing_mean,X_missing_0,X_missing_reg] mse = [] std = [] for x in X: estimator = RandomForestRegressor(random_state=0, n_estimators=100) scores = cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error',cv=5).mean() # 负的均方误差 mse.append(scores * -1) [*zip(['X_full','X_missing_mean','X_missing_0','X_missing_reg'],mse)] ''' [('X_full', 21.571667100368845), ('X_missing_mean', 30.82886303277032), ('X_missing_0', 35.91138076010484), ('X_missing_reg', 20.881091922248093)] ''' # 可视化呈现 from pyecharts import options as opts from pyecharts.charts import Bar c = ( Bar(init_opts=opts.InitOpts()) .add_xaxis(['X_full','X_missing_mean','X_missing_0','X_missing_reg']) .add_yaxis("",mse) .render("bar.html") )
或者x_labels = ['Full data','Zero Imputation','Mean Imputation','Regressor Imputation'] colors = ['r', 'g', 'b', 'orange'] plt.figure(figsize=(12, 6)) ax = plt.subplot(111) for i in np.arange(len(mse)): ax.barh(i, mse[i],color=colors[i], alpha=0.6, align='center') ax.set_title('Imputation Techniques with Boston Data') ax.set_xlim(left=np.min(mse) * 0.9,right=np.max(mse) * 1.1) ax.set_yticks(np.arange(len(mse))) ax.set_xlabel('MSE') ax.set_yticklabels(x_labels) plt.show()
3 拉格朗日插值法
原理
该插值的原理部分不在叙述
可以学习:
https://mp.weixin.qq.com/s/YoT0a7sMuvl7SUdPHyMBLghttps://mp.weixin.qq.com/s/Zoy3HHkO3AMPn_8ED_idoA
代码
网上拉格朗日插值代码
import pandas as pd #导入数据分析库Pandas from scipy.interpolate import lagrange #导入拉格朗日插值函数 data = pd.read_excel(r'C:\LG.xlsx', header=None) #读入数据 data_missing = data.copy() # 查看缺失情况 missing = data_missing .isna().sum() missing = pd.DataFrame(data_missing={'特征': missing.index,'缺失值个数':missing.values}) #通过~取反,选取不包含数字0的行 missing = missing[~missing['缺失值个数'].isin([0])] # 缺失比例 missing['缺失比例'] = missing['缺失值个数']/data_missing .shape[0] missing ''' 特征 缺失值个数 缺失比例 0 0 1 0.2 1 1 2 0.4 2 2 1 0.2 3 3 1 0.2 ''' #自定义列向量插值函数 #s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5 def ployinterp_column(s, n, k=5): if n>=k: if n+1+k<len(s): y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] else: y = s[list(range(n-k, n)) + list(range(n+1, len(s)))] else: if n+1+k<len(s): y = s[list(range(0, n)) + list(range(n+1, n+1+k))] else: y = s[list(range(0, n)) + list(range(n+1, len(s)))] y = y[y.notnull()] #剔除空值 return lagrange(y.index, list(y))(n) #插值并返回插值结果,但是有些值更无理 #逐个元素判断是否需要插值 for i in data_missing.columns: for j in range(len(data_missing)): if (data_missing[i].isnull())[j]: #如果为空即插值。 data_missing.loc[j][i]= ployinterp_column(data_missing[i], j) print('插值完成!') # 查看缺失情况 data_missing.isna().sum()
试一下,随机森林插补法部分构造的缺失数据集import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_boston from sklearn.impute import SimpleImputer from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score dataset = load_boston() # 总共506*13=6578个数据,不含缺失值 # 完整的数据 X_full, y_full = dataset.data, dataset.target n_samples = X_full.shape[0] # 样本 506 n_features = X_full.shape[1] # 特征 13 rng = np.random.RandomState(0) # 种子 # 缺失率为0.2,即构造的缺失值占20% missing_rate = 0.2 n_missing_samples = int(np.floor(n_samples * n_features * missing_rate)) # 缺失值索引 missing_col_index = rng.randint(0,n_features,n_missing_samples) missing_row_index = rng.randint(0,n_samples,n_missing_samples) X_missing = X_full.copy() y_missing = y_full.copy() # 替换,构造缺失值数据集 X_missing[missing_row_index,missing_col_index] = np.nan X_missing = pd.DataFrame(X_missing,columns=dataset.feature_names) X_missing_LG = X_missing.copy() # 查看缺失情况 missing = X_missing_LG .isna().sum() missing = pd.DataFrame(data={'特征': missing.index,'缺失值个数':missing.values}) #通过~取反,选取不包含数字0的行 missing = missing[~missing['缺失值个数'].isin([0])] # 缺失比例 missing['缺失比例'] = missing['缺失值个数']/X_missing_LG .shape[0] missing
使用拉格朗日插值#自定义列向量插值函数 #s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5 def ployinterp_column(s, n, k=5): if n>=k: if n+1+k<len(s): y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] else: y = s[list(range(n-k, n)) + list(range(n+1, len(s)))] else: if n+1+k<len(s): y = s[list(range(0, n)) + list(range(n+1, n+1+k))] else: y = s[list(range(0, n)) + list(range(n+1, len(s)))] y = y[y.notnull()] #剔除空值 return lagrange(y.index, list(y))(n) #插值并返回插值结果,但是有些值更无理 import time time_start=time.time() #逐个元素判断是否需要插值 for i in X_missing_LG.columns: for j in range(len(X_missing_LG)): if (X_missing_LG[i].isnull())[j]: #如果为空即插值。 X_missing_LG.loc[j][i]= ployinterp_column(X_missing_LG[i], j) time_end=time.time() print('totally cost',time_end-time_start) print('插值完成!') ''' totally cost 8.05620813369751 插值完成! '''
对比拉格朗日插值法—随机森林插值—均值填补—0填补
X = [X_full,X_missing_mean,X_missing_0,X_missing_reg,X_missing_LG] mse = [] std = [] for x in X: estimator = RandomForestRegressor(random_state=0, n_estimators=100) scores = cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error',cv=5).mean() # 负的均方误差 mse.append(scores * -1) # 画图 x_labels = ['X_full','X_missing_0','X_missing_mean','X_missing_reg','X_missing_LG'] colors = ['r', 'g', 'b', 'orange','pink'] plt.figure(figsize=(8, 6)) ax = plt.subplot(111) for i in np.arange(len(mse)): ax.barh(i, mse[i],color=colors[i], alpha=0.6, align='center') ax.set_title('Imputation Techniques with Boston Data') ax.axvline(x=min(mse), c="r", ls="--", lw=2) ax.set_xlim(left=np.min(mse) * 0.9,right=np.max(mse) * 1.1) ax.set_yticks(np.arange(len(mse))) ax.set_xlabel('MSE') ax.set_yticklabels(x_labels) plt.show()
4 其他(删除包含缺失行/列,用前/后一行,前后均值替换等)
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
删除包含缺失值的行:
df.dropna(axis = 0)
删除包含缺失值的列:
df.dropna(axis = 1)
如果一列里缺失值超过10%,则删除该列:
df.dropna(thresh=len(df)*0.9, axis=1)
去掉缺失比例大于80%以上的变量
df=df.dropna(thresh=len(df)*0.2, axis=1)
def find_missing(data): #统计缺失值个数 missing_num = data.isna().sum(axis=0).sort_values(ascending=False) missing_prop = missing_num/float(len(data)) #计算缺失值比例 drop_index = missing_prop[missing_prop>0.1].index.tolist() #过滤要删除特征名 return drop_index data2 = data.copy() data2.drop(find_missing(data2),axis = 1)
用一个标量替换缺失值:
df.fillna(value=10)
用上一行对应位置的值替换缺失值:
df.fillna(axis=0, method='ffill')
用前一列对应位置的值替换缺失值:
df.fillna(axis=1, method='ffill')
用下一行对应位置的值替换缺失值:
df.fillna(axis=0, method='bfill')
用后一列对应位置的值替换缺失值:
df.fillna(axis=1, method='bfill')
使用某一列的平均值替换缺失值:
df['Age'].fillna(value=df['Age'].mean(), inplace=True)
去除所有值都为NaN的行
df.dropna(how='all')
去除非缺失值小于4个的行
df.dropna(thresh=4)
去除在特定列出现NaN的行
df.dropna(subset=['C'])
df.dropna(axis=0, subset=['a','b'], inplace=True)
interpolate()插值法,缺失值前后数值的均值,但是若缺失值前后也存在缺失,则不进行计算插补。
df['a'] = df['a'].interpolate()
参考:菜菜的sklearn课堂——随机森林部分
数据分析之Pandas缺失数据处理 -
概率统计——五数概括法
2017-08-18 14:51:54分别写成Q1、Q2、Q3,第二四分位数也叫做中位数,是指数值在排序后的集合中最中间的数 IQR 我们将Q3-Q1的值叫做IQR 五数概括法 五数概括法即用以下五个数概括一组数据: 最小值 第一四分位数 第二四分位数(中... -
求平均数的三种方法
2019-04-22 12:12:14先求两个数之和,再除以二(或者右移一位)。 int a,b,c=0; scanf("%d%d",&a,&b); c=(a+b)/2;//c=(a+b)>>1; printf("%d",c); 但是这种方法有可能会导致数据溢出。那么我们又会想到,将两个数分别右移... -
有监督分类:概率分类法(Logistic)
2017-06-13 10:41:37对于模式基于概率进行分类的手法称为概率分类法。这是这一篇博客重点讨论的内容。 基于概率的模式识别,是指与模式x所对应的类别y的后验概率p(y|x)进行学习。其所属类别为后延概率达到最大值时所对应的类别。 类别... -
学习matlab(四)——概率与数理统计
2020-02-10 17:24:51在MATLAB中,提供了专门的统计工具箱Staticstics,该工具箱有几百个专用于求解概率和数理统计问题的函数。本章将详细的介绍随机数的产生,随机变量的概率密度函数和数字特征,以及假设检验、方差分析和统计绘图等。 ... -
python 计算概率密度、累计分布、逆函数的例子
2020-12-14 01:30:05计算概率分布的相关参数时,一般使用 scipy 包,常用的函数包括以下几个:pdf:连续随机分布的概率密度函数pmf:离散随机分布的概率密度函数cdf:累计分布函数百分位函数(累计分布函数的逆函数)生存函数的逆函数(1 -... -
常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)
2020-09-25 23:27:34目录1、穷举法2、贪心算法3、递归与分治算法4、回溯算法5、数值概率算法 1、穷举法 基本思想: 在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,从中筛选出问题的答案。 关键步骤:划定问题的解... -
德尔菲法——意见可靠预测方法
2019-07-09 08:59:14德尔菲法/得尔飞法(Delphi Method) 目录 1德尔菲法的简介 1.1德尔菲法的起源演变 1.2德尔菲法的典型特征 2德尔菲法的特征 3德尔菲法的具体实施步骤 3.... -
概率编程实战
2018-11-06 11:54:50概率编程充分结合了概率推理模型和现代计算机编程语言,使这一方法的实施更加简便,现已在许多领域(包括炙手可热的机器学习)中崭露头角,各种概率编程系统也如雨后春笋般出现。 本书的作者 Avi Pfeffer 正是主流... -
【概率论与数理统计】期末不挂科复习笔记
2021-12-28 20:56:57【概率论与数理统计】期末不挂科复习笔记 只能说最好先看看老师的ppt,在看看猴博士...贝叶斯其实是条件概率反过来求。其实就是已知结果求原因 可能和全概率公式结合考点,通过上一篇的P(有客车发生故障)= 0.0084来计 -
重拾图形图像处理 ---- 笔试题
2020-11-30 17:00:38一、填空题(每题1分,共15分) ...4、直方图均衡化适用于增强直方图呈尖峰 分布的图像。 5、依据图像的保真度,图像压缩可分为无损压缩 和有损压缩 6、图像压缩是建立在图像存在编码冗余 、像素... -
视觉SLAM笔记(30) 特征点法
2019-10-08 18:46:15特征点法、特征点、ORB 特征(FAST 关键点、BRIEF 描述子)、特征匹配 -
统计思维(实例4)——概率密度函数
2017-12-16 22:19:09概率密度函数 -
matlab如何找出一个数在数组中出现次数
2020-12-23 20:54:16mat2str 把数值数组转换成输入形态串数组 material 材料反射模式 max 找向量中最大元素 mbuild 产生EXE文件编译环境的预设置指令 mcc 创建MEX或EXE文件的编译指令 mean 求向量元素的平均值 median 求中位数 ... -
图像基本变换---图像二值化(包含OSTU/迭代法/统计法/双峰法/P分位法/最大熵法)
2016-05-11 14:05:21本文详细介绍了图像基本变换---图像二值化(包含OSTU/迭代法/统计法/双峰法/P分位法/最大熵法)的相关知识,并 给出了完整程序DEMO的下载链接,跟大家分享一下,希望大家喜欢! -
聊聊三维重建-条纹法之相位法(一)
2019-12-14 20:48:13在具体应用中采用几位Gray编码,几步相移需要根据实际情况选择。假设场景在条纹方向的像素宽度是N个像素,若要求在整个解包场景中对包裹进行无歧义展开,需要满足下式,其中k表示需要投影的Gray码光栅数, 表示包裹... -
超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的
2021-04-11 01:11:23直接得出: 根据数组建立平衡二叉搜索树 java整体打印二叉树 判断平衡二叉树 判断完全二叉树 判断二叉搜索树 二叉搜索树实现 堆的简单实现 堆应用例题三连 一个数据流中,随时可以取得中位数。 金条 项目最大收益... -
怎样用Python实现统计、概率、机器学习基础实验?一文看懂
2021-01-29 18:55:59本文介绍了概率及统计的基本概念、联系以及用法,并以正态分布为例展示了什么是概率分布、分布函数以及经验法则。同样本文还概念性地解释了中心极限定理,以及为什么正态分布在整个统计学中如此重要。此外,本文很多... -
超硬核!数据结构学霸笔记,考试面试吹牛就靠它
2021-03-26 11:11:21效率低的原因是,进行了大量重复计算,比如图中的f(8),f(7).....等等,你会发现f(8)其实早就算过了,但是你后来又要算一遍。 如果我们把计算的结果全都保存下来,按照一定的顺序推出n项,就可以提升效率, 斐波那契... -
OpenCV_12 图像分割:全阈值分割+自适应阈值分割+Otsu 阈值(大津法)+分水岭算法+GraphCut+GrabCut
2021-12-15 18:06:02阈值法的基本思想是基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值相比较,最后将像素根据比较结果分到合适的类别中。因此,该类方法最为关键的一步就是按照某个准则函数来求解最佳... -
超硬核!小白读了这篇文章,就能在算法圈混了
2021-03-29 10:21:581.2位运算 1.3打擂台 1.4morris遍历 第二节 2.1睡眠排序 2.2会死的兔子 2.3矩阵快速幂 2.4摔手机/摔鸡蛋 时空复杂度目录 二分 尝试较优的策略 归纳表达式 写出暴力递归 改为动态规划 压缩空间 ... -
[Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
2021-07-03 09:28:40使用误差的简单累加将使得正差值和负差值相互抵消,所采用的平方误差(最小二乘法)如下: 在数学上,求解过程就转化为求一组值使上式取到最小值,最常见的求解方法是梯度下降法(Gradient Descent)。根据平方误差... -
隔板法详解(各种方法)
2018-08-05 14:42:06理解隔板法 【定义】 隔板法就是在n个元素间的(n-1)个空中插入k个板,可以把n个元素分成k+1组的方法。 应用隔板法必须满足3个条件: (1) 这n个元素必须互不相异; (2) 所分成的每一组至少分得1个元素;... -
排列组合数学的相邻问题(插空法-捆绑法-隔板法)
2020-01-16 23:11:05插空法(处理不相邻问题) 插空法就是对于解决 某几个元素要求不相邻 的问题时,先将其他元素排好,再将所指定的不相邻的元素插入它们的间隙或两端位置。首要特点就是不相邻。 例题1: 把1,2,3,4,5组成没有重复... -
[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)
2021-07-06 12:56:02所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习... -
Python实现箱形图的绘制
2018-11-07 18:49:02说明:代码运行环境为 Win10+Python3+jupyter notebook 箱形图简介: 因为箱形图是基于五数概括法的图形汇总,在介绍箱形图前...(3)中位数(Q2) (4)第三四分位数(Q3) (5)最大值(Q3+1.5IQR) 而箱形图就是五... -
Matlab数据统计与分析(二)——常见的概率分布以及分位数
2020-08-15 12:39:27本文主要介绍数理统计中几种常见的概率分布函数及其图像绘制以及分位数的计算。后续将更新的内容有常见分布的随机数的产生、参数估计等。敬请期待。 一、计算概率分布律及密度函数值 matlab直接提供了通用的计算概率...