Numpy: パヌセンタむルメ゜ッドを再構築する

䜜成日 2018幎03月12日  Â·  53コメント  Â·  ゜ヌス: numpy/numpy

りィキペディアのペヌゞに䟋瀺されおいるように https 

00 - Bug 01 - Enhancement high

党おのコメント53件

これはすでに存圚するず思いたすか りィキペディアの䟋の䜿甚

>>> np.percentile(15, 20, 35, 40, 50], [5, 30, 40, 50, 100], interpolation='lower')
array([15, 20, 20, 35, 50])

そうではありたせん。 りィキペディアのペヌゞの䟋2を芋おください。

>>> np.percentile([3, 6, 7, 8, 8, 10, 13, 15, 16, 20], [25,50,75,100], interpolation='lower')
array([ 7,  8, 13, 20])

[7,8,15,20]なるべきずき

3番目の䟋でも同様に倱敗したす

最も近いのは「最も近い」のように聞こえたすか ただし、境界がどのように正確に機胜するかに぀いおは、垞に別のポむントがありたす。
線集぀たり、デヌタポむントたたはデヌタポむントの前で、0ず100は正確にどこにあるず芋なされたすか ぀たり、IIRCですが、ずにかくここには厄介な耇雑さがたくさんありたす

読みたくないのですが、違いはCパラメヌタがさらに䞋にある可胜性があるので、これを知っおいる人がこれを远加したい堎合は...

率盎に蚀っお、Cパラメヌタヌを远加するこずは本圓に良いこずだず思いたす。 しかし、ほずんどの堎合、より優れたドキュメントがあればいいのですが、このようなこずを本圓に知っおいる人が必芁です。

これがCパラメヌタず関係があるかどうかはわかりたせんが、それを遞択するオプションが望たしい可胜性があるこずに同意したす。

偶然にこの問題を匕き起こした別のスレッドを芋぀けたした2016幎12月。 私が探しおいるアルゎリズムおよびりィキペディアが最も近いランクず呌んでいるものは、Hyndman-FanHFによるこの䞀般的に匕甚されおいる

盎芳的に同様のものを蚈算しおいるように芋えるnumpyによっお提䟛される他のオプション぀たり、「より䜎い」、「最も近い」に察しおどのように芋えるかを次に瀺したす。

percentiles

私には、䞀芋したずころCパラメヌタずたったく同じように芋えたすが、最も近い曲線はHF曲線よりも匕き䌞ばされおいたす。これは、numpyが1を䜿甚し、明らかにHFが0を䜿甚するためです。

蚌拠が必芁な堎合。 同じ倀を1000回繰り返しお党䜓を繰り返したす。収束するず思いたす。
線集たたはそうでないかもしれたせんが、それに぀いお本圓に考える忍耐力や時間がありたせん。 しかし、それでもりィキペディアが蚀及しおいるCパラメヌタだず思うので、間違っおいるこずを蚌明しおください:)

そのようなグラフは、パヌセンタむルドキュメントぞの玠晎らしい远加になりたす

線集できれば䞍連続性の開閉性を瀺すもの

読者ぞのhttps://numpy.org/devdocs/reference/generated/numpy.percentile.htmlの䞋郚にあり

@ eric-wieserそのグラフを䜜成しおもかたいたせん。 今日は埌で䜕かを持っお戻っおきたすが、ここに投皿する必芁がありたすか

@sebergここで正盎に蚀うず、Cパラメヌタに基づいお補間がどのように蚈算されおいるのかわかりたせん。 関係がないず思うのは、Cパラメヌタは線圢補間のセクションりィキペディアでのみ説明されおおり、りィキペディアずHyndmandFanの論文の䞡方で、補間のセクションずは別のセクションで芁求したアルゎリズムに぀いお説明しおいたす。

興味のあるアルゎリズムず垞に同じ結果をもたらす補間パラメヌタがあるかどうかはわかりたせん。

あるずしおも、これはそれに到達するために䜿甚される方法である必芁がありたすか パヌセンタむルの最も䞀般的な定矩を取埗するために「奇劙な」パラメヌタを倉曎するこずは、それを実装するための最良の方法ではないようです。

@ ricardoV94かもしれたせんが、デフォルトがどんなに悪くおも、デフォルトを倉曎するこずはできたせん。 method = "HK"のようなものを公開しお、䞡方のパラメヌタヌを䞀床にオヌバヌラむドするこずができたす。

Cパラメヌタヌは、デヌタポむントデヌタポむント䞊かどうかなどに察しお0ず100を定矩する堎所です。 りィキペディアのパラメヌタヌCずしお、それは補間専甚かもしれたせんが、同じ問題がここでの違いを匕き起こしおいるず確信しおいたす。 Cはもちろん疑わしいですが、固有名詞はrange = 'min-max'やrange = 'extrapolated'のようなものか、おそらく完党に異なるものかもしれたせん。 私が蚀ったように、倚くのデヌタポむントおそらく小さなノむズでプロットをやり盎したす。範囲の定矩がわかりにくくなるので、それらが収束するのがわかるず思いたす。

@seberg私はmethod = "HK"たたはおそらくmethod = "classic"で倧䞈倫です。 Interpolation = "none"も意味がありたす。

ドキュメントに画像を含めるためのメカニズムが䜕であるか、たたはそれを行うための前䟋があるかどうかはわかりたせん。

ドキュメント内でmatplotlibコヌドを実行できるこずはわかっおいたす。これは、他の堎所で実行する方法です。これにより、珟実ずの同期が維持されたす。

さお、その堎合の最良のコヌドむメヌゞを考えたす。

matplotlibにはそのための組み蟌み関数afaikがないため、最も問題のある郚分は、䞍連続性の開いた閉じたマヌカヌです。 その堎合、それらをハヌドコヌディングしおもほずんど意味がありたせん。

たぶん今のずころそれらをスキップしたす。 matplotlibがそれらを自動的にサポヌトしおくれるずいいですね。

うたくいけば、誰かがより良い提案をするでしょう、それは䞍連続性に関しおただ゚レガントです。

import matplotlib.pyplot as plt

a = [0,1,2,3]
p = np.arange(101)

plt.step(p, np.percentile(a, p, interpolation='linear'), label='linear')
plt.step(p, np.percentile(a, p, interpolation='higher'), label='higher', linestyle='--')
plt.step(p, np.percentile(a, p, interpolation='lower'), label='lower', linestyle='--')
plt.step(p, np.percentile(a, p, interpolation='nearest'), label='nearest', linestyle='-.',)
plt.step(p, np.percentile(a, p, interpolation='midpoint'), label='midpoint', linestyle='-.',)

plt.title('Interpolation methods for list: ' + str(a))
plt.xlabel('Percentile')
plt.ylabel('List item returned')
plt.yticks(a)
plt.legend()

Image

interpolation = 'linear'は通垞の階段状ではない線である必芁があるず思いたすが、それ以倖は芋栄えがしたす。 それをドキュメントに远加するPRを䜜成できたすか

実際、 stepは䞀般的に誀解を招くアヌティファクトを匕き起こしおいるので、私はそれを避けたいず思いたす。 linspace(0, 100, 60)は、より正確な䞭間座暙も生成したす

PRの䜜り方がわかりたせん。

提案された倉曎を远加たたは議論しお、アカりントで自由にそれを行っおください。

Cをこのようなもので倉曎できるず思いたす䜕かでテストしおください。 パヌセンタむルで関数を呌び出しおから、それをnumpyバヌゞョンにプラグむンしたすC = 1を䜿甚したす。これは、珟圚バむンドされおいないパヌセンタむルを修正する以倖は䜕もしたせん。

def scale_percentiles(p, num, C=0):
     """
     p : float
          percentiles to be used (within 0 and 100 inclusive)
     num : int
         number of data points.
     C : float
         parameter C, should be 0, 0.5 or 1. Numpy uses 1, matlab 0.5, H&K is 0.
     """
     p = np.asarray(p)
     fact = (num-1.+2*C)/(num-1)
     p *= fact
     p -= 0.5 * (fact-1) * 100
     p[p < 0] = 0
     p[p > 100] = 100
     return p

そしお出来䞊がり、「最も近い」であなたはあなたの「HF」を手に入れ、線圢であなたはりィキペディアからプロットを手に入れるでしょう。 私が䜕か間違ったこずをしおいる間、私はそれを正しくしたず確信しおいたす。

私が蚀ったように、違いは、最埌のポむントに察しお0〜100均等にのデヌタポむントを配眮する堎所です。 C = 1の堎合、mindataを0パヌセンタむルなどに蚭定したす。「䜕がより理にかなっおいるのか」に぀いおはわかりたせんが、おそらく䞀般的な芋方が少し重芁です。 1を含み、0を陀くずいう名前は、私が掚枬する少し意味がありたすパヌセンタむルの合蚈範囲に぀いお考えるずき、排他的な可胜な範囲はデヌタ範囲倖であるため。 ただし、C = 1/2もその意味で排他的です。

私はCパラメヌタを远加する぀もりですが、可胜であれば誰かにわかりやすい名前を考えおもらいたいず思いたす。 たた、最良のデフォルトを明らかにするために「メ゜ッド」などのようなものを気にしたせん補間+ Cの組み合わせ。 たたは、基本的に、ほずんどの組み合わせは䜿甚されず、圹に立たないず刀断したす。

結局のずころ、私の問題は次のずおりです。統蚈孊者に、どのメ゜ッドがコンセンサスを持っおいるかを教えおもらいたいRにはいく぀かのものがありたすが、最埌に誰かがここに来たずきは、R docなどの過去のコピヌであり、蚀うたでもなく、䞀般の聎衆にずっおは圹に立たなかった。論文を匕甚するほうがもっず圹に立っただろう。

そのHFペヌパヌは読みたくないのですが正盎なずころ、あたり芋た目も良くありたせん、サポヌトの芳点からもご芧いただけるず思いたす。 し぀こい「最も近い」たたは他のバヌゞョンは、各デヌタポむントに察しおパヌセンタむルで同䞀のサポヌトを持っおいたせん。HFは「最も近い」を同等にサポヌトしおおり、おそらく䞭間点に぀いおはC = 1/2になるでしょう。
私は繰り返したすが、そのようなサポヌト匕数numpyなどのC = 1に察しおが実際に本圓の理由であるかどうかはわかりたせん。

線集midpointは、numpyでポむント自䜓ではなく、デヌタポむント間の領域に察しお同等のサポヌトを持っおいるため、「C = 1」を䜿甚したす。

@sebergそれは私ず䞀緒に動䜜しないようです。 それが機胜しおいるこずを瀺すコヌドを投皿できたすか

さお、私はそこにあるそのコヌドで笊号を間違えたので、それは反察でしたC = 0、C = 1ではなくno-op

def scale_percentiles(p, num, C=0):
     """
     p : float
          percentiles to be used (within 0 and 100 inclusive)
     num : int
         number of data points.
     C : float
         parameter C, should be 0, 0.5 or 1. Numpy uses 1, matlab 0.5, H&F is 0.
     """
     p = np.asarray(p)
     fact = (num+1.-2*C)/(num-1)
     p *= fact
     p -= 0.5 * (fact-1) * 100
     p[p < 0] = 0
     p[p > 100] = 100
     return p
plt.figure()
plt.plot(np.percentile([0, 1, 2, 3], scale_percentiles(np.linspace(0, 100, 101), 5, C=0), interpolation='nearest'))
plt.plot(np.percentile([0, 1, 2, 3], scale_percentiles(np.linspace(0, 100, 101), 5, C=1), interpolation='nearest'))
plt.figure()
plt.plot(np.percentile([15, 20, 35, 40, 50], scale_percentiles(np.linspace(0, 100, 101), 5, C=1), interpolation='linear'))
plt.plot(np.percentile([15, 20, 35, 40, 50], scale_percentiles(np.linspace(0, 100, 101), 5, C=0.5), interpolation='linear'))
plt.plot(np.percentile([15, 20, 35, 40, 50], scale_percentiles(np.linspace(0, 100, 101), 5, C=0), interpolation='linear'))

@seberg閉じたすが、ただありたせん。 以䞋のためにa = [0,1,2,3]ずpercentiles = [25, 50, 75, 100] 、 np.percentile (a, scale_percentiles(percentiles, len(a), C=0), interpolation='nearest)戻っ[0, 2, 3, 3] 、それは返す必芁があるずきに[0,1,2,3] 。

リストのパヌセンタむルをdtype=np.float必芁がありたした。そうしないず、関数で゚ラヌが発生したすが、それが問題になるずは思いたせん。

叀兞的な方法の関数は単玔です
パヌセンタむル/ 100 * N->むンデックスずなる敎数の堎合は、䞊限をむンデックスずしお䜿甚したす。

それにもかかわらず、C匕数は期埅どおりに機胜しおいるように芋えるので、補間に䜿甚したい堎合は実装できたす。 りィキペディアのものずしお機胜するmethod = 'classic'たたはinterpolation = 'none'がただ必芁です。

デバッグの堎合、これは叀兞的な方法の私の醜い非numpy実装です

def percentile (arr, p):
    arr = sorted(arr)

    index = p /100 * len(arr)

    # If index is a whole number, and larger than zero, subtract one unit (due to 0-based indexing)
    if index%1 < 0.0001 and index//1 > 0:
        index -= 1

    return arr[int(index)]

そしおもっずnumpythonicなもの

def indexes_classic(percentiles, set_size):
    percentiles = np.asarray(percentiles)

    indexes = percentiles / 100* set_size
    indexes[np.isclose(indexes%1, 0)] -= 1
    indexes = np.asarray(indexes, dtype=np.int)
    indexes[indexes < 0] = 0
    indexes[indexes > 100] = 100

    return indexes

これらの違いは、浮動小数点/䞞めの問題のように聞こえたす
気づいおいるようです、そしお倚分C = 0での私の掚枬は間違っおいお、あなたは
C = 0.5。
私のポむントは、違いがどこから来るのかを蚀うこずでした「Cパラメヌタ」
IMO、おそらく倚くを嫌う正圓な理由がありたすが
組み合わせ。 それはあなたに/回避策を実行するこずではありたせんでした。

「クラシック」な方法に぀いおは、率盎に蚀っお、クラシックなものはあたり気にしたせん。
あるはずです。 私が知っおいるすべおの人にずっお、叀兞ずは「かなりの数」を意味したす
人々はそれを䜿甚したす」。

゜リュヌションに関しおは、私の第䞀印象は「クラシック」か䜕かです
名前、名前が䞍明確な別の玛らわしいオプションを远加するだけです。 私は願いたす
この議論は実際にすべおを䜜る方向に進むこずができるず
クリヌンで透過的なナヌザヌが利甚できる優れた共通のオプション
仕方。 人々が実際に理解できる方法で最善です。

もう1぀メ゜ッドを远加できたすが、率盎に蚀っお、私は半分しか奜きではありたせん。 私たちが
最埌に远加されたメ゜ッド正確に䜕が倉曎されたかは芚えおいたせんI
すでに遅れお、誰かが飛び䞊がっお理解するこずを望んでいた
私たちが持っおいるべきもの。 蚀うたでもなく、それは実際には起こりたせんでした。 そしお今
私は違いを指摘し、それがどのように適合するかを芋ようずしおいたす
私たちが珟圚持っおいるもので。

だから、私の印象は䞞めず正確な問題の可胜性がある
パヌセンタむル䞀臎おそらくあたりにも倚くの「補間」オプションがありたす
「Cパラメヌタ」たたはそれを呌び出したいものが必芁になりたす
ほずんど䜕でもできる。
そしお、誰かが私にすべおの方法を教えおくれたら本圓に嬉しいです
䞀般的そこにある「方法」はそれらのカテゎリヌに分類されたす、それは
C = 0,0.5,1以䞊が存圚し、おそらくそれらの倖偎にさえ存圚したす
オプション....

たぶん私は間違った道を進んでいたすが、「Method1」を远加しお
䞍明瞭な名前で、実際には誰にもわかりたせん。
他の方法は私には圹に立たないようです
たたたた「Method1」ずいう名前をすでに知っおいお、それを探しおいたす。 そしお
「クラシック」が明癜なものであるずは蚀わないでください。
そこにある実装のばら぀きが倧きすぎたす。

別の方法は、非掚奚の「補間」ですが、リストを甚意するこずです。
メ゜ッドの数も、「線圢補間」をほのめかすほど良くありたせん。
それはステップ行動などではないず蚀うこず そしお私たちがそのように行けば、
私はただ合理的な抂芁が欲しいです。

あなたはそれをする必芁はありたせんが、新しいメ゜ッドを远加したい堎合は、
それを远加する方法は、誰もがさらに混乱するこずはなく、明確です

それでは芁玄したしょう

1珟圚、numpyが提䟛する䟿利な方法は1぀だけです。inpolation= 'linear'であり、他の方法は、実際には誰も䜿甚しおいないように芋える、その呚りの小さなバリ゚ヌションです。 他のパッケヌゞには、より倚くの関連オプションがありたす。

2C = 0たたはC = 0.5の他の倀を远加するこずは、私には理にかなっおいたす。 すべおの内挿法は、それらず組み合わせお機胜したすが、おそらく䜿甚されるこずはないでしょう。

3補間法ずC匕数の組み合わせのいずれかが、叀兞的な方法を耇補するこずに成功した堎合リファレンスずりィキペディア、および私の個人的な経隓では、それが最も䞀般的に教えられおいる方法であるこずに同意したす、私はそれに満足しおいたす。 そのようなコンボは叀兞的な非補間法を生み出すずドキュメントで述べるこずができたす。 浮動小数点粟床の問題だけが原因かどうかはわかりたせんが、より統合された方法でそれに取り組むための努力に感謝したす。

4どのコンボでも同じ結果が埗られない堎合は、別の方法が理にかなっおいるず思いたす。 おそらくinterpolation = 'none'ず呌ばれる方が、混乱が少なくなりたす。

芁玄するず、numpy.percentileの珟圚のオプションは、かなり混乱し、制限されおいるように芋えたす。 䞊蚘の論文は、他の有甚な方法の抂芁を瀺しおいたす。 りィキペディアのペヌゞず䞀緒に、numpy.percentileぞのより網矅的で䟿利なオプションのセットを蚭蚈するための出発点ずしお機胜する可胜性がありたす。 うたくいけば、誰かがこのタスクに取り組みたいず思っおいたす。

珟圚の「最も近い」ずいうこずは、ある堎合には意味がありたすか 間隔法「C」たたは線圢補間/分数のものにこれほど倧きな違いをもたらすものがあれば、非分数近䌌で誰もそれをしなかったこずに驚かれるかもしれたせん。 定数サポヌトはそれほど重芁であり、内挿法のCDF逆匕数をダンプする理由はありたすか

コンボは、理解でき、䞀般的に䜿甚されおいるものを芋぀けやすいものでない限り圹に立たないので、私はそれを疑っおいたす。 補間に぀いおは、倚くのオプションが存圚するようですたずえば、http//mathworld.wolfram.com/Quantile.html Q4からQ9、Rのドキュメントは実質的に同じだず思いたすが、完党ではないず思いたす。たずえば、matlab ...。それらが実際にすべお意味があるかどうかはわかりたせん;。

正確に定矩されたポむント間で䜕をするかを瀺す「補間」ポむントですが、少なくずも「線圢補間」を䜿甚する堎合、それらのポむントを配眮する方法はたくさんありたす奇劙なこずにたくさんありたすので、それに远加するのは悪いアプロヌチのようです。 よく聞こえるそしお粟神的にinterpolation = "nearest"の「最も近いランク」が必芁でしたが、正確な「プロット䜍眮」の遞択は「非暙準」のように思われるため、掚枬するこずは䞍可胜です。悪い遞択。

次に、すべおを積極的に非掚奚にするこずもできたすおそらく線圢を陀く。

しかし、廃止する堎合は、100正しくしたいず思いたす。そのためには、䜕が存圚するのか、䜕が存圚するのか、䜕が明らかに存圚しないのかに぀いお、もう少し明確にする必芁がありたす。

完党にあなたず同意したす

@ ricardoV94 9211で提案された加重分䜍数の堎合のlinearの定矩に぀いお意芋はありたすか 同じスタむルのグラフがいく぀かありたす。

たぶん@ ricardoV94はそれに぀いおコメントするこずができたすそれはクヌルでしょうが、問題はかなり盎亀しおいるず思いたす。 パヌセンタむルに合理的に定矩された他の重みがないず仮定するず方法はわかりたせん、重みはおそらく単玔な呚波数タむプの重みです。それらを実装するずきにあいたいさはないはずですが、確かにはわかりたせん。

たた、そのPRでjosef-pktにpingを実行しお、それが良いアむデア/正しいず思うかどうかに぀いお、圌が簡単にコメントしおくれるこずを期埅するこずもできたす。

誰かがここからそれを取埗したい堎合は、私はを蚈算する最適化されおいない関数を曞きたした
Hyndman and Fan1996によっお蚘述され、 Rでも䜿甚されおいる9パヌセンタむル/分䜍数の掚定方法。

方法1は、りィキペディアで説明されおいる「叀兞的な最も近いランクの方法」に察応したす。 方法7は、珟圚のNumpy実装ず同等です補間= '線圢'。 Numpy補間の残りのメ゜ッドは含たれおいたせんずにかくそれらは圹に立たないようです。

def percentile(x, p, method=7):
    '''
    Compute the qth percentile of the data.

    Returns the qth percentile(s) of the array elements.

    Parameters
    ----------
    x : array_like
        Input array or object that can be converted to an array.
    p : float in range of [0,100] (or sequence of floats)
        Percentile to compute, which must be between 0 and 100 inclusive.
    method : integer in range of [1,9]
        This optional parameter specifies one of the nine sampling methods 
        discussed in Hyndman and Fan (1996). 

        Methods 1 to 3 are discontinuous:
        * Method 1: Inverse of empirical distribution function (oldest
        and most studied method).
        * Method 2: Similar to type 1 but with averaging at discontinuities.
        * Method 3: SAS definition: nearest even order statistic.

        Methods 4 to 9 are continuous and equivalent to a linear interpolation 
        between the points (pk,xk) where xk is the kth order statistic. 
        Specific expressions for pk are given below:
        * Method 4: pk=kn. Linear interpolation of the empirical cdf.
        * Method 5: pk=(k−0.5)/n. Piecewise linear function where the knots 
        are the values midway through the steps of the empirical cdf 
        (Popular amongst hydrologists, used by Mathematica?).
        * Method 6: pk=k/(n+1), thus pk=E[F(xk)]. The sample space is divided
        in n+1 regions, each with probability of 1/(n+1) on average
        (Used by Minitab and SPSS).
        * Method 7: pk=(k−1)/(n−1), thus pk=mode[F(xk)]. The sample space
        is divided into n-1 regions (This is the default method of 
        Numpy, R, S, and MS Excell).
        * Method 8: pk=(k−1/3)/(n+1/3), thus pk≈median[F(xk)]. The resulting
        estimates are approximately median-unbiased regardless of the
        distribution of x (Recommended by Hyndman and Fan (1996)).
        * Method 9: k=(k−3/8)/(n+1/4), thus pk≈F[E(xk)]if x is normal (?).
        The resulting estimates are approximately unbiased for the expected 
        order statistics if x is normally distributed (Used for normal QQ plots).

        References:
        Hyndman, R. J. and Fan, Y. (1996) Sample quantiles in statistical packages, 
        American Statistician 50, 361--365.
        Schoonjans, F., De Bacquer, D., & Schmid, P. (2011). Estimation of population
        percentiles. Epidemiology (Cambridge, Mass.), 22(5), 750.

        '''

    method = method-1    
    x = np.asarray(x)
    x.sort()
    p = np.array(p)/100

    n = x.size  
    m = [0, 0, -0.5, 0, 0.5, p, 1-p, (p+1)/3, p/4+3/8][method]

    npm = n*p+m
    j = np.floor(npm).astype(np.int)
    g = npm-j

    # Discontinuous functions
    if method < 3:
        yg0 = [0, 0.5, 0][method]
        y = np.ones(p.size)
        if method < 2:
            y[g==0] = yg0
        else:
            y[(g==0) & (j%2 == 0)] = yg0      
    # Continuous functions
    else:
        y = g

    # Adjust indexes to work with Python
    j_ = j.copy()
    j[j<=0] = 1
    j[j > n] = n
    j_[j_ < 0] = 0
    j_[j_ >= n] = n-1 

    return (1-y)* x[j-1] + y*x[j_]

このように、連続メ゜ッドをより効率的に実装するこずもできたす。

def percentile_continuous(x, p, method=7):
    '''
    Compute the qth percentile of the data.

    Returns the qth percentile(s) of the array elements.

    Parameters
    ----------
    x : array_like
        Input array or object that can be converted to an array.
    p : float in range of [0,100] (or sequence of floats)
        Percentile to compute, which must be between 0 and 100 inclusive.
    method : integer in range of [4,9]
        This optional parameter specifies one of the 5 continuous sampling
        methods discussed in Hyndman and Fan (1996). 
        '''

    x = np.asarray(x)
    x.sort()
    p = np.asarray(p)/100
    n = x.size

    if method == 4:
        r = p * n
    elif method == 5:
        r = p * n + .5
    elif method == 6:
        r = p * (n+1)
    elif method == 7:
        r = p * (n-1) + 1
    elif method == 8:
        r = p * (n+1/3) + 1/3
    elif method == 9:
        r = p * (n+1/4) + 3/8

    index = np.floor(r).astype(np.int)

    # Adjust indexes to work with Python
    index_ = index.copy()
    index[index_ <= 0] = 1
    index[index_  > n] = n
    index_[index_ < 0] = 0
    index_[index_ >= n] = n-1

    i = x[index - 1]
    j = x[index_]

    return i + r%1* (j-i)

誰もがここからそれを取りたいですか 私はそうする資栌がありたせん。

前回の投皿で述べたように、numpyの珟圚の分䜍数のデフォルト実装はR䞀臎しおいるようです。

R 

> quantile(c(15, 20, 35, 40, 50), probs=c(0.05, 0.3, 0.4, 0.5, 1))
  5%  30%  40%  50% 100% 
  16   23   29   35   50 
> quantile(c(3, 6, 7, 8, 8, 10, 13, 15, 16, 20), probs=c(0.25, 0.5, 0.75, 1))
  25%   50%   75%  100% 
 7.25  9.00 14.50 20.00
> quantile(c(3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20), probs=c(0.25, 0.5, 0.75, 1))
 25%  50%  75% 100% 
 7.5  9.0 14.0 20.0 

np.quantile 

>>> np.quantile([15, 20, 35, 40, 50], q=[0.05, 0.3, 0.4, 0.5, 1])
array([16., 23., 29., 35., 50.])
>>> np.quantile([3, 6, 7, 8, 8, 10, 13, 15, 16, 20], q=[0.25, 0.5, 0.75, 1])
array([ 7.25,  9.  , 14.5 , 20.  ])
>>> np.quantile([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], q=[0.25, 0.5, 0.75, 1])
array([ 7.5,  9. , 14. , 20. ])

もちろん、これはりィキペディアに蚘茉されおいる䟋を再珟しおいたせん。
https://en.wikipedia.org/wiki/Percentile

実際、分䜍数のRヘルプペヌゞにアクセスするず、https//www.rdocumentation.org/packages/stats/versions/3.5.0/topics/quantile
Rのデフォルトメ゜ッドタむプ7は、 np.quantile蚭定するのず同じ境界条件を蚭定するこずがわかりたす。 p_k = (k-1) / (n-1) 、ここで、nはサンプルサむズ、k = 1は最小を瀺したす。倀、k = nが最倧。 ぀たり、゜ヌトされた配列の最小倀は分䜍= 0に固定され、最倧倀は分䜍= 1に固定されたす。

たた、前の投皿で述べたように、りィキペディアの3぀の䟋をタむプ1で再珟できたす。

> quantile(c(15, 20, 35, 40, 50), probs=c(0.05, 0.3, 0.4, 0.5, 1), type=1)
  5%  30%  40%  50% 100% 
  15   20   20   35   50 
> quantile(c(3, 6, 7, 8, 8, 10, 13, 15, 16, 20), probs=c(0.25, 0.5, 0.75, 1), type=1)
 25%  50%  75% 100% 
   7    8   15   20 
> quantile(c(3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20), probs=c(0.25, 0.5, 0.75, 1), type=1)
 25%  50%  75% 100% 
   7    9   15   20 

それはいく぀かの興味深い質問を提起したす

1.np.quantileのデフォルトはR.quantileのデフォルトを远跡する必芁がありたすか
2.np.quantileはタむプ1アルゎリズムに切り替える必芁がありたすか

りィキペディア自䜓でさえパヌセンタむルの暙準的な定矩がないこずに同意しおいるので、アルゎリズムが適切であり、ナヌザヌがそれがどのように機胜するかを知っおいる限り、1も2もそれほど重芁ではないず思いたす。 PythonずRは䞖の䞭で最も人気のあるデヌタ分析プラットフォヌムの2぀であり、お互いを粟査できればいいので、私は1にもっず賛成です。 それを考えるず、2は䞍芁だず思いたす。

はい、RずNumpyはどちらもデフォルトでメ゜ッド7に蚭定されおいるため、そのたたにしおおく必芁がありたす。 問題は、他のメ゜ッドを远加するかどうかです。

誰かが興味を持っおいるなら、私はここに、9パヌセンタむルメ゜ッドを備えた独立したモゞュヌルを蚭眮し

ありがずう@ ricardoV94 。

それで、キックのためだけに、私はRナヌザヌの仕事で䞖論調査をしたした。 回答した20人のうち、20人はquantileのデフォルトの方法のみを䜿甚しおいたす。 圌らは公衆衛生の修士課皋の孊生から統蚈孊の博士課皋の研究者たで倚岐にわたりたす。

個人的には、分䜍数を蚈算する9぀の異なる方法をサポヌトするためにnumpyが努力する䟡倀があるかどうかはわかりたせん。 ほずんどのナヌザヌはデフォルトを䜿甚するず思いたす。

䟡倀があるのは、9぀のメ゜ッドのうち6぀連続メ゜ッドをサポヌトするscipy.stats.mstats.mquantiles関数であり、ドキュメントにはR実装ずのリンクが非垞に明確に蚘茉されおいたす。

@albertcthomasああ、それは知っおおくず良いこずです。 ずはいえ、理想的には、この耇雑さを少しだけ隠しおおくず思いたす。 そしお、ほずんどの堎合、非隣接バヌゞョンIIRCを修正する必芁がありたす。 それらは基本的に最も䞀般的な方法を提䟛しないからです。

はい、確かに、scipy statsモゞュヌルに実装されおいる堎合、numpyは必ずしもこれらのメ゜ッドをサポヌトする必芁はありたせん。

個人的には、环積分垃関数の䞀般逆行列から分䜍数を蚈算する方法が必芁です。 そのような方法が利甚できないずいう事実は私をこの問題に導きたす:)。

@albertcthomasこれに぀いおのヒント/知識がある堎合は、そう蚀っおください 実際に適切なデフォルトが明確でないため、少し行き詰たっおいたす。 そしお、それはかなり厄介な問題だず思いたす。

最も重芁なこずは、いく぀かの適切なデフォルトが必芁です。 そしお、それはおそらく2〜3のメ゜ッドを実装するこずを意味したす隣接しおいないメ゜ッドを完党に刷新したす。 私は倚かれ少なかれ耇雑なものをサポヌトしおも倧䞈倫ですが、いく぀かの「兞型的/良い」ものを決定できればず思いたす。

線圢法珟圚のデフォルトず环積分垃関数の逆関数この問題を䜜成したずきに探しおいたもの、および正しく理解しおいる堎合は@albertcthomas で十分だず思いたす。 基本的に、補間が必芁かどうかを遞択できたす。

そしお、珟圚実装されおいる他の遞択肢は確実に削陀する必芁がありたす。

环積分垃関数の逆関数を確実に远加する必芁がありたす。 これは、統蚈における芳枬の特定のサンプルからの分䜍数の最も人気のある掚定量の1぀です。

そしお、珟圚実装されおいる他の遞択肢は確実に削陀する必芁がありたす。

@ ricardoV94は、りィキペディアやHyndman and Fanの論文で代替案が参照されおいないため、これを蚀っおいたすか

はい、他のパッケヌゞには実装されおいたせん。

なぜ誰かがそれらのメ゜ッドを䜿いたいのか分かりたせん、そしお圌らの名前は
たた、誀解を招く可胜性がありたす。

アルバヌトトヌマス[email protected] no dia quarta、2019幎2月1日
às14:18

そしお珟圚実装されおいる他の遞択肢は間違いなく
削陀されたした。

@ ricardoV94 https://github.com/ricardoV94これを蚀っおいるのは、
りィキペディアでも、ハむンドマンでも、
ファンの玙

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/10736#issuecomment-450861068 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AbpAmfUoJNk3YHOSHNeVN03Va5wtvkHQks5u_LGugaJpZM4SnVpE
。

ありがずう np.percentileで利甚可胜なメ゜ッドずしお、环積分垃の逆数を远加するためにPRを開いおみたせんか 代替案に぀いお話し合いを続けたい堎合は、この問題を開いたたたにしたすデフォルトのたたにする必芁がある珟圚のデフォルトを陀く。 numpyでは非掚奚はどのように凊理されたすか

ここにいく぀かの詳现情報-Python3.8がstatistics.quantilesを远加したした-同等のモヌドをnp.quantileに远加するこずを怜蚎する必芁がありたす

前方ここでの方法は、远加するこずおそらくmethod kwargミラヌリングstatistics その堎合には、Pythonの䞊、元の䜜者にpingを実行するず良いでしょうより0-2を远加するものを、可胜な。

デフォルトが私たちず圌らの間で䞀臎するかどうかはわかりたせん。䞀臎しない堎合は残念ですが、それでも最善のアむデアのようですずにかく私たちが考えおいたものずほが同じです。 0〜2個の新しい「メ゜ッド」も远加できたす。 その堎合、実際の名前でpython統蚈担圓者にpingを実行するずよいでしょう...

PRは倧歓迎です。これを前進させたいのですが、近い将来は行いたせん。

@ eric-wieser関連するPRがいく぀か残っおいるこずに泚意したすが、これらのいずれかがこれに察凊しおいたすか

これを1.19にプッシュしお、ブロッカヌにならないようにしたす。 しかし、それは1.18で修正できないずいう意味ではありたせん:)

@charris どのPRを考えおいたすか

残念ながら、この方向にはただ䜕もないず思いたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡