Presentation Slides at PyCon mini Osaka 2018 https://osaka.pycon.jp/
Python ではじめるスパースモデリング2018年5月19日PyCon mini Osaka@ ヤフー株式会社 GFOオフィス
View Slide
છాوࢤ ͦΊ͔ͩͨ͠• גࣜձࣾϋΧϧε औక$50• 1ZUIPOྺ • .BDIJOF-FBSOJOH.FFUVQ,"/4"* ্ཱͪ͛• IUUQTNMNLBOTBJDPOOQBTTDPN
ϋΧϧεͱ• ϥΠϑαΠΤϯεɾ࢈ۀ Y"*• εύʔεϞσϦϯάΛ࣠ͱͨ͠σʔλղੳ• ౦େֶɾେؔਅ೭।ڭत͕ΞυόΠβʔ
ຊͷΰʔϧ• εύʔεϞσϦϯάΛͬͯΒ͏• 1ZUIPOͰͷΞϧΰϦζϜ࣮ΛΈͯΒ͏• ߟ͑ํɾಛʹڵຯΛͬͯΒ͏
εύʔεϞσϦϯάͱ
εύʔεϞσϦϯά• σʔλʹࡏ͢Δεύʔεੑʹணͯ͠ɺࣄΛϞσϧԽ͢Δख๏• ୯ҰͷΞϧΰϦζϜΛࢦ͢Θ͚Ͱͳ͍• ࠒ͔Β׆ൃʹݚڀ͞Ε͍ͯΔ
σϞ• Χϝϥ͔Βͷը૾Λֶश• എܠΛਪఆ• ҠಈମΛݕग़
ػցֶशͷಋೖ࣌ͷ՝• ࣗಈԽ͍͕ͨ͠ɺઆ໌͋Δ• σʔλऩूͷ࣌ؒίετ͕େ͖͍• ϋʔυΣΞͷίετ͍͑ͨ
εύʔεϞσϦϯάͷظ• ೖྗಛྔͷதͷॏཁͳͷ͕Θ͔Δ• গྔͷใ͔ΒਪఆΛߦ͑Δ• (16ڥҎ֎Ͱಈ࡞͢Δ
ઢܗճؼͰͷεύʔεϞσϦϯά• લఏ• ग़ྗ Z ɺೖྗ Yͷઢܗ݁߹ͱ؍ଌϊΠζЏͰදݱ͞ΕΔ• ೖྗ Y N ࣍ݩɺ؍ଌ͞Εͨ Z O ݸ͋Δͱ͢Δ! = #$%$+ ⋯ + #(%(+ )㱺 Z Λ͍͍ײ͡ʹઆ໌͢Δ X ΛΓ͍ͨ
ઢܗճؼͰͷεύʔεϞσϦϯά• ղ͖͘• ؍ଌ Z ͱਪఆͨ͠ X ͔Βܭࢉ͞ΕΔͷೋޡࠩΛ࠷খԽmin12& − () *㱺 Z ͷαϯϓϧ͕ Y ͷ࣍ݩΑΓখ͍͞߹ʁ
εύʔε੍ͷՃ• ະͷΑΓํఔࣜͷ͕গͳ͍࿈ཱํఔࣜ• Yʹର͢Δεύʔεͳ੍ΛՃͯ͠ղ͘• ʮͳΔ͘গͳ͍ Y Ͱ݅Λຬͨ͢ʯ㱺ʮͳΔ͘ଟ͘ͷ X Λ ʹ͢Δʯ• ૉʹΔͱɺΈ߹Θͤ࠷దԽ㽊
-ϊϧϜ࠷దԽ• ੍݅Λ؇• ʮX ͷઈରͷ૯ΛͳΔ͘খ͘͢͞Δʯ• ؇ͯ͠େҬత࠷దղ͕ಘΒΕΔ• తʹղ͘͜ͱ͕Ͱ͖Δ
• -FBTU"CTPMVUF4ISJOLBHFBOE4FMFDUJPO0QFSBUPS ͷུ• -ϊϧϜΛਖ਼ଇԽ߲ͱͯ͠Ճͨ͠తؔ-BTTPmin12& − () * + , ( -㱺 ਖ਼ଇԽύϥϝʔλЕͰεύʔε੍ͷޮ͖Λௐ
छʑͷΞϧΰϦζϜ• ࠲ඪ߱Լ๏ $PPSEJOBUF%FTDFOU• ࠷খ֯ճؼ -FBTU"OHMF3FHSFTTJPO• ෮ॖখᮢΞϧΰϦζϜ *45"• ަޓํ๏ "%..
ྫɿ࠲ඪ߱Լ๏ͷΞϧΰϦζϜ1. #$% = 1, … , ) ΛॳظԽ2. +#$= , - . /0 .1, 2 Ͱߋ৽3($) = 6 − 89:$; 9#9 ͱ͠ɺ, ೈᮢ࡞༻ૉͱ͢Δ3. ऩଋ݅·Ͱ܁Γฦ͠
ೈᮢ࡞༻ૉ• Λθϩʹ͚ۙͮΔ࡞༻Λ࣋ͭS ", $ = &" − $, (" ≥ $)0, (−$ < " < $)" + $, (" ≤ −$)
ྫɿ࠲ඪ߱Լ๏ͷ࣮ྫ# def soft_threshold(X, thresh):return np.where(np.abs(X) <= thresh, 0, X - thresh * np.sign(X))# w_cd = np.zeros(n_features)for _ in range(n_iter):for j in range(n_features):w_cd[j] = 0.0r_j = y - np.dot(X, w_cd)w_cd[j] = soft_threshold(np.dot(X[:, j], r_j) / n_samples, alpha)
࣮ߦ݁Ռೖྗಛྔͷ࣍ݩ ඇθϩཁૉ αϯϓϧ
ͦͷଞͷ࣮• TDJLJUMFBSO• ࠲ඪ߱Լ๏ͱ࠷খ֯ճؼ• IUUQTDJLJUMFBSOPSHTUBCMFNPEVMFTHFOFSBUFETLMFBSOMJOFBS@NPEFM-BTTPIUNM• IUUQTDJLJUMFBSOPSHTUBCMFNPEVMFTHFOFSBUFETLMFBSOMJOFBS@NPEFM-BTTP-BSTIUNM• TQNJNBHF• ަޓํ๏• IUUQTHJUIVCDPNIBDBSVTTQNJNBHFCMPCEFWFMPQNFOUTQNJNBHFMJOFBS@NPEFMBENNQZ
TQNJNBHF• εύʔεϞσϦϯά༻ϥΠϒϥϦ• ը૾ղੳʹ༻͍ΒΕΔΞϧΰϦζϜΛத৺ʹ• TDJLJUMFBSOΠϯλʔϑΣʔεʹ४ڌ• IUUQTHJUIVCDPNIBDBSVTTQNJNBHF
ը૾ॲཧͷద༻• جຊΞΠσΟΞ• ը૾͔ΒύονΛΓग़͢• ύονΛಉαΠζͷࣙॻجఈͷઢܕ݁߹Ͱදݱ͢Δ• ը૾શମΛදݱ͢ΔͨΊࣙॻֶश͢Δ
ը૾ॲཧͷద༻:ը૾"ࣙॻ! "#$#9
ࣙॻʹΑΔ࠶ߏYύον جఈͰͷ࠶ߏ݁Ռ
ྫɿࣙॻֶशͱ࠶ߏ# patches = extract_simple_patches_2d(img, patch_size)# patches = patches.reshape(patches.shape[0], -1).astype(np.float64)intercept = np.mean(patches, axis=0)patches -= interceptpatches /= np.std(patches, axis=0)# model = MiniBatchDictionaryLearning(n_components=n_basis, alpha=1,n_iter=n_iter, n_jobs=1)model.fit(patches)# reconstructed_patches = np.dot(code, model.components_)reconstructed_patches = reconstructed_patches.reshape(len(patches),*patch_size)reconstructed = reconstruct_from_simple_patches_2d(reconstructed_patches,img.shape)
ܽଛิͷద༻ܽଛΛߟྀͨࣙ͠ॻֶशʹΑΔใ෮ݩը૾ :ʹର͠ྼԽ࡞༻ૉ .͕͔͔Δͱߟ͑ͯॲཧΛߦ͏
·ͱΊ
εύʔεϞσϦϯάͱ• ೖྗಛྔͷதͷॏཁͳͷ͕Θ͔Δ• গྔͷใͰ͡ΊΔ͜ͱ͕Ͱ͖Δ• طଘ࣮ΛͬͯؾܰʹࢼͤΔ• TDJLJUMFBSO TQNJNBHF• ຊͷ༰ ˠ IUUQTHJUJPWQY2