PCA Color Augmentationãšã¯AlexNetã®è«æã§æå±ãããData Augmentationã®æ¹æ³ã®1ã€ã§ããè«æèªäœã¯2012å¹Žãšæ¯èŒçå€ããã®ã®ãäž»æååæïŒPCAïŒã䜿ã£ãŠãããããããŒã¿ã®è²ååžãå å³ããè²ã®å æžãã§ããData AugmentationãšããŠããçšããããã«ã©ãŒãã£ã³ãã«ã·ãããããèªç¶ãªç»åãåºæ¥äžãããŸãã
è£è¶³è¿œèšïŒãã®æç« äžã«åºãŠãããåæ£å ±åæ£è¡åãã§ãããæšæºåå·®ã®èª¿æŽãè¡ã£ãŠãããããå®éã¯äžèº«ãçžé¢è¡åã®åæ£å ±åæ£è¡åãšãªã£ãŠããŸããåºãŠããç»åã¯ããŸã倧ããéãã¯åºãŸãããããã®ç¹ãæ°ã«ãªãæ¹ã¯æ³šæããŠãã ããã远èšã«æ¹è¯ã³ãŒããšãã®ãã¹ããèšããŸããã
远èšïŒGitHubã«å ¬éããŸãããhttps://github.com/koshian2/PCAColorAugmentation
ã³ãŒã
PCA Color Augmentationã®ã³ãŒãã¯ä»¥äžã®ãšããã§ãããã¡ãã®å®è£ ãåèã«ããŸããã
import numpy as np
def pca_color_augmentation(image_array_input):
assert image_array_input.ndim == 3 and image_array_input.shape[2] == 3
assert image_array_input.dtype == np.uint8
img = image_array_input.reshape(-1, 3).astype(np.float32)
img = (img - np.mean(img, axis=0)) / np.std(img, axis=0)
cov = np.cov(img, rowvar=False)
lambd_eigen_value, p_eigen_vector = np.linalg.eig(cov)
rand = np.random.randn(3) * 0.1
delta = np.dot(p_eigen_vector, rand*lambd_eigen_value)
delta = (delta * 255.0).astype(np.int32)[np.newaxis, np.newaxis, :]
img_out = np.clip(image_array_input + delta, 0, 255).astype(np.uint8)
return img_out
äžèº«ã«ã€ããŠã¯åŸã»ã©è§£èª¬ããŸããnp.uint8ã®åœ¢åŒã®ç»åïŒé åïŒã1æå ¥åããŠãPCA Color Augmentationæžã¿ã®np.uint8圢åŒã®é åãè¿ããšããã·ã³ãã«ãªãã®ã§ãã
åãããŠã¿ã
ãã¡ãã«ããããªãŒçŽ æã®ãªãŠã ã®ç»åããµã³ãã«ã«äœ¿ããŸãã坿ãã§ããã
ãã®ç»åã9åPCA Color Augmentationãããçµæã以äžã®éãã§ãã
ãªããªãè¯ãåºæ¥äžããã§ããåçã§é²åºã調æŽãããšã ããããããªæãã§å€ããã®ã§ãããªãèªç¶ãªData Augmentationã§ãããšèšããã§ãããã
çè«
AlexNetã®è«æã®ã4.1 Data Augmentationãã«èšãããŠããŸãããã£ããèšããšãå ¥åç»åã®RGBã®åŒ·ãã«å¿ããŠData Augmentationããããšããææ³ã§ããå ·äœçãªèšç®æ¹æ³ã¯**ã«ã©ãŒãã£ã³ãã«ãããã®äž»æååæïŒPCAïŒ**ã䜿ããšããã®ããã€ã³ãã§ãã
PCAã䜿ããšããã®ã¯è«æäžã®è¡šèšã§ãããããæ¬¡å åæžã®ææ³ãšããŠäœ¿ãããäž»æååæãšã¯å°ãæå³åããéã£ãŠãããã§ã®PCAã¯ãã åã«ã«ã©ãŒãã£ã³ãã«ãããã®åºæãã¯ãã«ãšåºæå€ãæ±ãããšããäœçœ®ã¥ãã§ããæ¬¡å åæžãã©ã£ãã§ãã£ãŠããã®ããªïŒãšæã蟌ããšçè§£ãã¥ãããªããŸãã
ããŸãç»åã®åº§æš$(x, y)$ã«ãããã¯ã»ã«å€$I_{xy}$ã$[I_{xy}^R, I_{xy}^G, I_{xy}^B]^T$ããšããŸããããR, G, Bã¯åã«ã©ãŒãã£ã³ãã«ã®ãã¯ã»ã«å€ãšããŸãããã¯ã»ã«å€ã0ïœ255ã§è¡šãããå ŽåãäŸãã°èµ€ã®ãã¯ã»ã«ã ã£ãã$[255, 0, 0]^T$ãšãªããŸãã
PCA Color Augmentationã§ã¯ãã®$I_{xy}$ã«ä»¥äžã®åŒã§èšç®ããããã¯ãã«ãè¶³ããŸãã
\begin{bmatrix}\mathbf{p}_1 & \mathbf{p}_2 & \mathbf{p}_3\end{bmatrix} \begin{bmatrix}\alpha_1\lambda_1 & \alpha_2\lambda_2 & \alpha_3\lambda_3 \end{bmatrix}^T
ããããã®ã«ã©ãŒãã£ã³ãã«ã«ã€ããŠã$\mathbf{p}$ã¯åºæãã¯ãã«ã$\lambda$ã¯åºæå€ã衚ããŸããå·ŠåŽã®$\mathbf{p}$ã®æ¬åŒ§å šäœã¯3Ã3ã®è¡åã«ãªããŸãã
$\alpha$ã¯ä¹±æ°ã§ãå¹³å0ãæšæºåå·®ã0.1ã®æ£èŠååžã«åŸãä¹±æ°ã§ãã«ã©ãŒãã£ã³ãã«ããšã«ç¬ç«ã«ãµã³ããªã³ã°ããŸãããã®**$\alpha$ãåè²ãã©ãã ã匷ãããããšããææš**ã«ãªããŸãïŒåŸã§ç¢ºèªããŸãïŒã$\alpha\lambda$ããšãã«ã¹ã«ã©ãŒãªã®ã§ã転眮åŸã®å³åŽã®æ¬åŒ§ã¯3Ã1ã®è¡åãšãªããŸãããããã£ãŠãå·Šãšå³ã®å ç©ãåããšã3Ã3è¡åãš3Ã1è¡åã®å ç©ãªã®ã§ã3Ã1è¡åãšãªããŸããå ã®ãã¯ã»ã«$I_{xy}$ã3Ã1è¡åãªã®ã§ããã«è¶³ãã°ããã§ããã
ã§ã¯å ·äœçã«ã©ãäž»æååæãèšç®ããã®ããšããã®ããã€ã³ãã§ããã以äžã®ããã»ã¹ã«ãªããŸãã
- $(y, x, c)$ãšããshapeã®ç»åã®é åãã$(xy, c)$ãšãã2次å ã®è¡åã«å€æãã
- ã«ã©ãŒåäœã§åæ£å ±åæ£è¡åãèšç®ããããã®è¡åã¯cÃc=3Ã3ã®è¡åã«ãªã
- ãã®åæ£å ±åæ£è¡åãåºæå€åè§£ããåºæå€ãšåºæãã¯ãã«ãæ±ãã
å®ã¯ãã®åæ£å ±åæ£è¡åâåºæå€åè§£ãšããããã»ã¹ãã®ãã®ãäž»æååæãªã®ã§ãã以äžã®èšäºã«è©³ããæžãããŠããã®ã§ã芧ãã ããã
PCAãšSVDã®é¢é£ã«ã€ããŠ
https://qiita.com/horiem/items/71380db4b659fb9307b4
ã¹ããããã€ã¹ãããã§ç¢ºèªãã
æåã«ç€ºããã³ãŒãããä¹±æ°ã®å€ãæå®ã§ãã圢ã«ããŠåãããŠã¿ãŸããå°ãã³ã¡ã³ããã€ããŠã¿ãŸããã
def pca_color_step_by_step(image_array_input, random):
assert image_array_input.ndim == 3 and len(random) == 3
assert image_array_input.shape[2] == 3
assert image_array_input.dtype == np.uint8
# ãã¯ã»ã«, ã«ã©ãŒãã£ã³ãã«ã®åœ¢åŒã«å€æ
img = image_array_input.reshape(-1, 3).astype(np.float32)
# ã«ã©ãŒãã£ã³ãã«åäœã§æšæºå
img = (img - np.mean(img, axis=0)) / np.std(img, axis=0)
# 忣å
±åæ£è¡å, ååäœã§èšç®ãããã®ã§rowvar=Falseãšãã
cov = np.cov(img, rowvar=False)
# åºæå€ãšåºæãã¯ãã«ã®èšç®
lambd_eigen_value, p_eigen_vector = np.linalg.eig(cov)
# PCA Color Augmentationã«ããå¢å
delta = np.dot(p_eigen_vector, random*lambd_eigen_value)
delta = (delta * 255.0).astype(np.int32)[np.newaxis, np.newaxis, :]
# åºåç»å
img_out = np.clip(image_array_input + delta, 0, 255).astype(np.uint8)
return img_out
ãŸãã¯image_array_input.reshape()ã§3éã®ãã³ãœã«ãã2éã®ãã³ãœã«ïŒè¡åïŒã«å€æããŠããŸãããã®ããšã«æšæºåããŠå°æ°ã®ã¹ã±ãŒã«ã«ããã®ã§ãããã§uint8ããfloat32ã«ãã£ã¹ãããŠããŸãã
次ã«ãäž»æååæã§éèŠãªæšæºåãããŠããŸããã«ã©ãŒãã£ã³ãã«ã§éèšããã®ã§ããã£ã³ãã«éã®å¹³åãæšæºåå·®ã§æšæºåããŸãã
ãããŠåæ£å ±åæ£è¡åãèšç®ããŸããããã¯np.covã§ç°¡åã«èšç®ã§ããŸããrowvar=Falseãæå®ããªããšè¡ïŒãã¯ã»ã«éïŒã§éèšãããŠããŸãã®ã§ãã«ã©ãŒãã£ã³ãã«éã§éèšãããããã«æå®ããŸãããã®çµæã¯3Ã3è¡åã«ãªããŸãã
åºæå€åè§£ã¯np.linalg.eigã§ã§ããŸããåæ£å ±åæ£è¡åãåºæå€åè§£ãã3次å ãã¯ãã«ã®åºæå€ãšã3Ã3è¡åã®åºæãã¯ãã«ã«åè§£ãããŸãã
ããšã¯ã«ã©ãŒãã£ã³ãã«ã®å¢åãèšç®ããŸããããã§int8ãšãã£ã¹ãããŠããŸããšãå¢åã倧ãããšãã«ã¢ã³ããŒorãªãŒããŒãããŒããããšãããã®ã§å¢åã¯32ãããintãšããŠå®çŸ©ããŸããã3éãã³ãœã«ã§ããå ¥åç»åãšèšç®ããããã«æ¬¡å ãæ¡åŒµããŠããŸãã
æåŸã«0ïœ255ã®ç¯å²ã«ãªãããã«å€ãã¯ãªããã³ã°ããŠãuint8ã«ãã£ã¹ãããŠçµããã§ããããã§PCA Color Augmentationãå®è£ ã§ããŸãããããšã¯å¢å$\alpha$(random)ãå€ããŠã©ã®ããã«åºåãå€ãããã確èªããŸãããã
R, G, Bã®ä¹±æ°ã-0.2, -0.1, 0, 0.1, 0.2ã®5ãã¿ãŒã³ãèš125ãã¿ãŒã³ãåºåããŠåç»ã«ããŠã¿ãŸããã
å®éã¯æšæºåå·®0.1ã®æ£èŠä¹±æ°ã䜿ãã®ã§ã-0.1ïœ0.1ã68%, -0.2ïœ0.2ã95%ã®å²åã§åºçŸããŸãããããå®éã®ä¹±æ°ã䜿ã£ãäŸã§ãïŒããªãŒçŽ æã®ç«ç»åã䜿ããŸããïŒã
æãããšããã¯ããæãããªããæãæã¯æããŸãŸã§ç¢ºãã«è²èª¿ãç¶æããŠããã®ã確èªã§ããŸããããã¯ãªããªã匷ãããªData Augmentationã§ããã
èšç®éã®ç¢ºèª
䟿å©ãããªPCA Color Augmentationã§ãã1ã€ã ãæ°ã«ãªããã€ã³ãããããŸããããã¯äž»æååæã®å éšã§éè¡åãèšç®ãããŠãããããèšç®éã®åé¡ããããšããããšã§ããéè¡åã®èšç®éã¯å€ããš$O(N^3)$ãšããã¢ã«ãŽãªãºã ãšããŠã¯é«äŸ¡ãªãªãŒããŒãªã®ã§ãããã«ããã¯ãšãªãå¯èœæ§ã¯ãããŸã1ã
次ã®ã³ãŒãã§ãã¥ãŒã©ã«ãããã¯ãŒã¯ã§ã®ç»åã®èªã¿èŸŒã¿ãåçŸããŠã¿ãŸãããã
import time
import numpy as np
def make_image(width):
return (np.random.rand(width, width, 3) * 255.0).astype(np.uint8)
if __name__ == "__main__":
start_time = time.time()
for i in range(1000):
img = make_image(256)
img_aug = pca_color_augmentation(img)
elapsed = time.time() - start_time
print(elapsed)
ä¹±æ°ã§ç»åã1000æäœæããPCA Color Augmentationãã³ã¡ã³ãã¢ãŠããããã©ããã§åŠçæéãæ¯èŒããŸããè§£å床256x256ãš512x512ã§åã±ãŒã¹3åæž¬å®ããŸãããGoogle Colabã®CPUã€ã³ã¹ã¿ã³ã¹2ã§èšæž¬ããŸãããåäœã¯ç§ã§ãã
# 256x256 PCA-Augãªã
2.630277156829834 2.5239434242248535 2.574631452560425
# 256x256 PCA-Augãã
12.860137462615967 12.779702186584473 12.894489049911499
# 512x512 PCA-Augãªã
11.647570610046387 12.336450576782227 11.551325798034668
# 512x512 PCA-Augãã
54.012206077575684 53.79096794128418 54.03123617172241
ã±ãŒã¹ããšã®å¹³åå€ãèšç®ããŠãŸãšããŸããã
| ã±ãŒã¹ | å¹³åç§ | ãªãŒããŒããã | æ / ç§ç®å® |
|---|---|---|---|
| 256x256 ãªã | 2.58 | - | - |
| 256x256 ãã | 12.84 | 10.27 | 97.39 |
| 512x512 ãªã | 11.85 | - | - |
| 512x512 ãã | 53.94 | 42.10 | 23.75 |
è§£å床ã倧ãããªã£ãŠã2ä¹3ä¹ã®ããŒã¹ã§èšç®éãå¢ããªããããŸã ãããã®ã®ãæããã«åŠçæéã¯å¢ããŠããŸããçžŠãæšªã®å¹ ããããã$N$ãšãããªããããããããã¯$O(N^2)$ã®ãªãŒããŒã§ããããPCA Color Augmentationãå ¥ãããšåŠçæéã5ïœ6åã«ãªãã®ã¯æµç³ã«å€ãã®ã§ãããããããèšç·Žé床ã«åœ±é¿ãåºããããããŸãããããã¯ã±ãŒã¹ãã€ã±ãŒã¹ãªã®ã§ãå®éã®èšç·Žã§èšæž¬ããŠã¿ãªããšããããŸããã
远èšïŒTPUã§èšæž¬ãããšãããããããµã€ãºãäžãããšPCA Color Augmentationãããã«ããã¯ãšãªã£ãŠããŸããŸãããCIFAR-10ã§èšç·ŽãããŠãªãã ãš1ãšããã¯7ç§ãããã ã£ãã®ããããã ãš16ç§ããããŸãã軜ãã®ã¢ãã«ã ã£ãã®ããããªãã£ããããããŸãããé«éåããããã®ãªãGPU/TPUã§ããŒã¹ãã§ããKerasã®ã«ã¹ã¿ã ã¬ã€ã€ãŒã§å®çŸ©ãã¹ãã§ããããã
远èšïŒã¡ãã£ãšé£ããã§ãããã³ãœã«æŒç®ã䜿ãã°ããå°ãéãã§ããã¯ãã§ãã
PCA Color Augmentationã®ã¢ã«ãŽãªãºã ãæ¯ãè¿ã£ãŠããèãããšãéè¡åã¯åžžã«3Ã3è¡åã§èšç®ããŠãããããã®èšç®éã£ãŠéè¡åã®èšç®ãããã¯å€ååæ£å ±åæ£è¡åã®èšç®éšåãªãã§ããããGPUã§ãããã§ããã°ãã¹ãã§ãããã¡ãã£ãšãã®é ãã¯æ°æã¡æªããªãšããã®ãæ£çŽãªææ³ã§ãããã¡ããCPUãšGPUãããŸã忥ããŠããã«ããã¯ã«ãªããªãªããã°äœã®åé¡ããããŸããã
ãã ãããã®PCA Color Augmentationã¯ããªã匷åã§ææ³ã§ãAlexNetã®è«æã«ããImageNetã®Top1ãšã©ãŒçã1%ä»¥äžæžãããããšãããŸãããŸããå®éã®åºåç»åãèŠããšãããããã«ãAugmentationåŸã®ç»åã¯å ç»åã®å ç·ãç §æã®å æžãå€åããããã®ã«çžåœããã®ã§ãããçšããããåçŽãªã«ã©ãŒãã£ã³ãã«ã®å¢æžãããããªãèªç¶ãªå°è±¡ãäžããŸãããŸããããã¯èªåã®æèŠã§ãããData Augmentationã¯ã¢ã«ãŽãªãºã 次第ã§ã¯åé¡åé¡ã§ã¯äœ¿ããŠãç©äœæ€åºã§ã¯äœ¿ããªãïŒäœ¿ãã¥ããïŒã±ãŒã¹ããããªããPCA Color Augmentationã¯ç»åã ãã®äœçšã§å®çµããã®ã§ç©äœæ€åºã§ãç°¡åã«äœ¿ããŸãããªã®ã§ãèšç®éãããããããšãªã䜿ã£ãŠã¿ã䟡å€ã¯ååã«ãããšæããŸãã
ãŸãšã
PCA Color Augmentationã¯ã«ã©ãŒãã£ã³ãã«åäœã§äž»æååæããããå ã®ç»åã®è²ã®ååžãå å³ããŠãData Augmentationãããã¢ã«ãŽãªãºã ã§ããåºãŠããç»åã¯ããªãèªç¶ãªã®ã§ããã²äœ¿ã£ãŠã¿ãŠãã ãããåã«è¡åã®åºæå€åè§£ïŒäž»æååæïŒã®å¿çšäŸãšããŠèŠãŠãé¢çœãã§ãã
远èšïŒããã¡ãã£ãšæ¹è¯ããŠã¿ãïŒæšæºåå·®ãåäžåããªãïŒ
å®ã¯åæ£å ±åæ£è¡åãšçžé¢è¡åã®éããç¥ããªããŠ3ããã£ããæšæºåå·®ã§å²ã£ãŠå ç»åãæšæºåããŠããŸãããæšæºåå·®ã§å²ã£ãŠããŸããšR,G,Bã®æšæºåå·®ãåäžåããŠããŸãã®ã§ãå ã®è²ã®ååžãæãªãå¯èœæ§ããããŸããç¹ã«åãã£ã³ãã«ã«è²ãåã£ãç»åã§çºçãããããªããŸããã¡ãªã¿ã«å¹³åã§åŒãã®ã¯äœãåé¡ãããŸããã
ãã ããã¹ã±ãŒãªã³ã°ã®éœåäžã忣ã倧ããã調æŽããã®ã¯å¿ é ã§ããããã©ãäž¡ç«ãããæ©ã¿ãŸããããã®æ¹æ³ãããã®ã§ã¯ãªãã§ãããããã¹ã±ãŒãªã³ã°å®æ°$k$ãå®çŸ©ãã
$$ k(X-\mu)$$
ãšãã倿ãããŸãã$\mu$ã¯ãã£ã³ãã«éã®å¹³åã§ãããã®ãšãã®åæ£å ±åæ£è¡åã«ã¯æ¬¡ã®ãããªé¢ä¿ããããŸãã
$$Cov(kX) = k^2Cov(X)$$
忣ãªã®ã§kã¯2ä¹ã«ãªããŸããããã§ãåãã£ã³ãã«ã®åæ£ã®åèšã3ïŒïŒãã£ã³ãã«æ°ïŒã«ãããšããå¶çŽããããŸããã¡ãªã¿ã«æšæºåå·®ã§å²ã£ãå Žåã¯å¯Ÿè§èŠçŽ ãå šãŠ1ã«ãªãã®ã§åæ£ã®åèšã¯åžžã«3ã«ãªããŸããåãã£ã³ãã«ã®åæ£ã$\sigma^2_R, \sigma^2_G, \sigma^2_B$ãšãããš
\begin{align}
k^2(\sigma^2_R+\sigma^2_G+\sigma^2_B) &= 3 \\
k &= \sqrt{\frac{3}{\sigma^2_R+\sigma^2_G+\sigma^2_B}}
\end{align}
ããã§ã¹ã±ãŒãªã³ã°å®æ°kãæ±ããããŸããã³ãŒãã¯ä»¥äžã®ããã«å€ãããŸãã
def pca_color_augmentation_modify(image_array_input):
assert image_array_input.ndim == 3 and image_array_input.shape[2] == 3
assert image_array_input.dtype == np.uint8
img = image_array_input.reshape(-1, 3).astype(np.float32)
# 忣ãèšç®
ch_var = np.var(img, axis=0)
# 忣ã®åèšã3ã«ãªãããã«ã¹ã±ãŒãªã³ã°
scaling_factor = np.sqrt(3.0 / sum(ch_var))
# å¹³åã§åŒããŠã¹ã±ãŒãªã³ã°
img = (img - np.mean(img, axis=0)) * scaling_factor
cov = np.cov(img, rowvar=False)
lambd_eigen_value, p_eigen_vector = np.linalg.eig(cov)
rand = np.random.randn(3) * 0.1
delta = np.dot(p_eigen_vector, rand*lambd_eigen_value)
delta = (delta * 255.0).astype(np.int32)[np.newaxis, np.newaxis, :]
img_out = np.clip(image_array_input + delta, 0, 255).astype(np.uint8)
return img_out
èã£ã±ã®ç»åã§æ¯èŒ
ç·ïŒGïŒã®æåãå€ãã®èã£ã±ã®ç»åã§ãã

**äžã倿ŽåïŒæšæºåå·®ã§å²ã£ãã±ãŒã¹ïŒãäžã倿ŽåŸïŒæšæºåå·®ã§å²ããªãã±ãŒã¹ïŒ**ã§ããåäžã®ä¹±æ°ã䜿ã£ãŠããŸãã

ã©ã£ã¡ãã©ããšã¯äžæŠã«ã¯èšããªãã§ããã倿ŽåŸã®ã»ããè¥å¹²éïŒBïŒã®ãã£ã³ãã«ãäžããã«ãããªã£ãŠããã®ãããããŸãã確ãã«ãã®ç»åéèŠçŽ ã»ãšãã©ãªãã®ã§ãRGBãåäžã«äžããïŒå€æŽåïŒã¯ã¡ãã£ãšããããããªãšæããŸãã
倿¥ã®ç»åã§æ¯èŒ
èµ€ïŒRïŒã®æåãå€ãã®å€æ¥ã®ç»åã§ãã

äžã倿Žåãäžã倿ŽåŸã§ãã

éæåãã»ãšãã©åããªããªã£ãåé¢ãèµ€ã®ãã£ã³ãã«ãããåãããã«ãªããŸããã
ç«ã®ç»åã§æ¯èŒ
æ®éã®ç»åã§ããè²åœ©ã«è©³ãã人ã§ãªããšéããããããªãããã
ãªãŠã ã®ç»åã§æ¯èŒ
ã±ã£ãšèŠéããããããããªããè²åœ©ãåã£ãç»åã§ãªããšç®ã«èŠããŠå·®ãåºãªãã®ã§ã¯ãšã
-
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®èšç®éãšæ¯ã¹ããšéŒ»ããã¿ãããªãã®ã§ãããData Augmentationã¯éåžžã€ã³ãããåã®CPUã§èšç®ããããããã¥ãŒã©ã«ãããã¯ãŒã¯ã®ãããªããã€ã¹ã«ããé«éåã¯ã§ããŸããã â©
-
Intel(R) Xeon(R) CPU @ 2.30GHz Ã2ïŒ/proc/cpuinfoããïŒ â©
-
å ããŒã¿ãå¹³åã§åŒããæšæºåå·®ã§å²ããšåæ£å ±åæ£è¡åã¯ã察è§èŠçŽ ãå šãŠ1ã§ããçžé¢è¡åãšçãããªããŸãã詳ããã¯ãã¡ãã«æžããŸãããhttps://blog.shikoan.com/cov-corr-gram-matrix/ â©






