Numpy: ๋ฒกํ„ฐ์— ๋Œ€ํ•ด ์ •์˜ ๋œ Frobenius Norm?

์— ๋งŒ๋“  2020๋…„ 02์›” 06์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

์ด๊ฒƒ์€ ๊ตฌํ˜„ ์งˆ๋ฌธ์ด ์•„๋‹ˆ๋ผ "์ฒ ํ•™"์งˆ๋ฌธ์— ๊ฐ€๊น์ง€๋งŒ Frobenius Norm์ด ๋ฒกํ„ฐ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๊นŒ? ์ถœ์ฒ˜ : Wolfram

ํ˜„์žฌ numpy์˜ Frobenius Norm์€ ๋ฒกํ„ฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import numpy as np
a = np.random.rand(10, 1)
b = np.squeeze(a)
print(np.linalg.norm(a, 'fro'))
print(np.linalg.norm(b, 'fro'))

๊ฒฐ๊ณผ :

1.7594677278427366
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
//anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py in norm(x, ord, axis, keepdims)
   2515             try:
-> 2516                 ord + 1
   2517             except TypeError:

TypeError: can only concatenate str (not "int") to str

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-18-2ace847024a5> in <module>
      3 b = np.squeeze(a)
      4 print(np.linalg.norm(a, 'fro'))
----> 5 print(np.linalg.norm(b, 'fro'))

<__array_function__ internals> in norm(*args, **kwargs)

//anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py in norm(x, ord, axis, keepdims)
   2516                 ord + 1
   2517             except TypeError:
-> 2518                 raise ValueError("Invalid norm order for vectors.")
   2519             absx = abs(x)
   2520             absx **= ord

ValueError: Invalid norm order for vectors.
00 - Bug numpy.linalg good first issue

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ์ฝ”๋“œ์—์„œ ์กฐ๊ธˆ ๋” ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜๋ฐ›์€ ์˜ค๋ฅ˜์˜ ์—ญ ์ถ”์ ์„ ๋”ฐ๋ฅด๋ฉด ๋ฌธ์ œ๊ฐ€๋˜๋Š” ๋น„ํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# 14719 ๋ฐ # 14215์˜ ํ† ๋ก ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด> 2 ์ฐจ์›์˜ ๋™์ž‘์€ ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.์ด PR์„ kwarg ์ฒ˜๋ฆฌ์˜ ๋ฒ„๊ทธ๋กœ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

Re : ํ…Œ์ŠคํŠธ / ๊ธฐ์—ฌ๋ฅผ์œ„ํ•œ ๋ฆฌ์†Œ์Šค : NumPy์˜ ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ ๋ผ์ธ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. numpy/linalg/tests/test_linalg.py ์—์„œ linalg ํ…Œ์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ๊ณต์‹ํ™”๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ ์ ˆํ•œ ์œ„์น˜์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ชจ๋“  6 ๋Œ“๊ธ€

์ด๊ฒƒ์€ 'fro' kwarg ์ฒ˜๋ฆฌ์˜ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

>>> print(np.linalg.norm(b))
1.7547099704258247

ord kwarg๊ฐ€ None์ด๋ฉด Frobenius ํ‘œ์ค€์ด ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

xref gh-14719 ๋ฐ gh-14215 : ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ๋ก€๋ฅผ ํ๊ธฐ ํ•  ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ์ง€๋งŒ ํฐ ์ €ํ•ญ์ด ์—†์—ˆ์ง€๋งŒ ์ผ๋ถ€๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง„ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋Š” ๊ทธ๊ฒƒ์„ ๊ทธ๋ ‡๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌธ์ œ๋Š” ์ •ํ™•ํžˆ ์–ด๋””๋กœ ๊ฐ€์•ผํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

Ross๊ฐ€ ๋‚˜์—๊ฒŒ ์ง€์ ํ–ˆ๋“ฏ์ด ๋‚ด๊ฐ€ ์—ฐ๊ฒฐ ํ•œ ๋ฌธ์ œ / PR์€ ์ ‘์„  ์ ์œผ๋กœ ๋งŒ ๊ด€๋ จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด๋Š” "fro" ์ฒ˜๋ฆฌ์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

kwarg ์ฒ˜๋ฆฌ (๋ฐ ์ˆ˜๋ฐ˜๋˜๋Š” ํ…Œ์ŠคํŠธ)์˜ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ PR์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์ข‹์€ ์บ์น˜ @TNonet

์ด๊ฒƒ์ด ๋‚ด ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ํ…Œ์ŠคํŠธ ๋ฐ ํ’€ ์š”์ฒญ์„์œ„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

(๋˜ํ•œ numpy repo๋ฅผ ๋ณต์ œํ•˜๊ณ  setup.py๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ numpy๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” numpy ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)

๋‚˜๋Š” ord๊ฐ€ 'fro'๋ผ๋ฉด 2512-14 ์ค„ ์•„๋ž˜์— ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

https://github.com/numpy/numpy/blob/dae4f67c797176c66281101be8f3b4d6c424735c/numpy/linalg/linalg.py#L2510 -L2524

๋‹ค์Œ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

if ((ord is None) or 
    (ord in ('f', 'fro')) or 
    (ord == 2 and ndim == 1)): 

๋ชจ๋“  ์‚ฌ๋žŒ์ด n ์ฐจ ๋ฐฐ์—ด์— ๊ฐ ์š”์†Œ์˜ ์ œ๊ณฑ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ฉ์‚ฐํ•˜๋Š” Forbenious Norm์ด ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ์ฝ”๋“œ์—์„œ ์กฐ๊ธˆ ๋” ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜๋ฐ›์€ ์˜ค๋ฅ˜์˜ ์—ญ ์ถ”์ ์„ ๋”ฐ๋ฅด๋ฉด ๋ฌธ์ œ๊ฐ€๋˜๋Š” ๋น„ํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# 14719 ๋ฐ # 14215์˜ ํ† ๋ก ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด> 2 ์ฐจ์›์˜ ๋™์ž‘์€ ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.์ด PR์„ kwarg ์ฒ˜๋ฆฌ์˜ ๋ฒ„๊ทธ๋กœ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

Re : ํ…Œ์ŠคํŠธ / ๊ธฐ์—ฌ๋ฅผ์œ„ํ•œ ๋ฆฌ์†Œ์Šค : NumPy์˜ ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ ๋ผ์ธ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. numpy/linalg/tests/test_linalg.py ์—์„œ linalg ํ…Œ์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ๊ณต์‹ํ™”๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ ์ ˆํ•œ ์œ„์น˜์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰