ย
ย
ย
์ ์ฌํ ์ฌ์ฉ์/์์ดํ ์ ์ฐพ๋ ํ์ ํํฐ๋ง
ย
1) ํ์ ํํฐ๋ง์ด๋? (feat. ์ ์, ์ข ๋ฅ)
ํ์
ํํฐ๋ง์ ํ ์ฌ์ฉ์์ ๊ตฌ๋งค ํจํด ๋ฐ ํ์ ์ ๋ค๋ฅธ ์ฌ์ฉ์๋ค์ ๊ตฌ๋งค ํจํด ๋ฐ ํ์ ๊ณผ ๋น๊ตํ์ฌ ์์ดํ
์ ์ถ์ฒํ๋ ๋ฐฉ์์ด๋ค. ์ฆ, ํด๋น ์ฌ์ฉ์์ ๋น์ทํ๊ฒ ํ์ ์ ๋งค๊ธด ์ฌ์ฉ์๋ค์ ์ฐพ์ ์ด๋ค์ ๊ตฌ๋งค ํจํด ๋ฐ ํ์ ์ ๋ณด๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ์์ดํ
์ ์ถ์ฒํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ์
ํํฐ๋ง์์๋ ์ถ๊ฐ์ ์ธ ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด๋ ์์ดํ
์ ๋ณด๊ฐ ์์ด๋ ์ถ์ฒ์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ์
ํํฐ๋ง์๋ ํฌ๊ฒ ์ต๊ทผ์ ์ด์๊ธฐ๋ฐ ํ์
ํํฐ๋ง๊ณผ ์ ์ฌ ์์ธ๊ธฐ๋ฐ ํ์
ํํฐ๋ง ๋ ๊ฐ์ง๊ฐ ์๋ค. ๋จผ์ ์ต๊ทผ์ ์ด์๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ๋ธ๋ก ๊ธฐ๋ฐ์ ๋ชจ๋ธ์ธ KNN์ ํ์ฉํ๋ฉฐ, Netflix Prize Competition์์ ์ฐ์นํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ ๋ช
ํด์ก๋ค. ์ด์ ๋ฌ๋ฆฌ ์ ์ฌ ์์ธ๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ์ ์ฌ ์์ธ์ ํ์ฉํ๋ค.
ย
2) ํ์ ํํฐ๋ง์ ๊ธฐ์ด
(1) K Nearest Neighbors(KNN)
ย
์ด์๊ธฐ๋ฐ ํ์
ํํฐ๋ง์์ ํ์ฉ๋๋ KNN ์๊ณ ๋ฆฌ์ฆ์, ํ ์ฌ์ฉ์(ํน์ ํ ์ )์ ๊ฐ์ฅ ๊ทผ์ ํ K๊ฐ์ Neighbors๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ผ๋ก๋ก ์์ ๊ทธ๋ฆผ์์ Pt๋ผ๋ ์ ์ด ์๋ก ๋ค์ด์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ด ์ ์ด ์ด๋ค Class์ ์ํ๋์ง๋ฅผ ์๊ณ ์ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด Pt๋ Class A์ ๋ ๊ฐ, Class B์ ์ธ ๊ฐ, Class C์ ๋ ๊ฐ์ ์ ์ด ํฌํจ๋๊ณ ์์ผ๋ฏ๋ก ์ธ ๊ฐ์ ์ ์ด ํฌํจ๋ Class B์ ๊ฐ์ฅ ๊ทผ์ ํ๋ค๊ณ ๋งํ ์ ์์ผ๋ฉฐ, B๋ฅผ Pt์ Class๋ก ์ ํ ์ ์๋ ๊ฒ์ด๋ค.
ย
(2) ๋ฐ์ดํฐ(Explicit Feedback)
๋จผ์ ๋ฐ์ดํฐ์ ํํ์ ๋ํด์ ์์๋ณธ ๋ค, ํ์
ํํฐ๋ง ๊ฐ๊ฐ์ ๋ํด์ ์์๋ณด๊ณ ์ ํ๋ค. ๋ฐ์ดํฐ์ ํํ์๋ ํฌ๊ฒ Implicit Feedback๊ณผ Explicit Feedback ๋ ๊ฐ์ง๊ฐ ์๋ค. ์ฌ์ฉ์๊ฐ ์์ดํ
์ ๊ตฌ๋งคํ๋์ง ๊ตฌ๋งคํ์ง ์์๋์ง์ ๋ํ ์ ๋ณด๋ ์๊ณ ์์ผ๋ ์ด ์์ดํ
์ ์ข์ํ๋์ง ์ซ์ดํ๋์ง์ ๋ํ ๋ฐ์ ์ ๋ณด๋ฅผ ๋ชจ๋ฅด๊ณ ์๋ ์ํ๋ฅผ Implicit์ด๋ผ๊ณ ํ๊ณ , ์ฌ์ฉ์๊ฐ ์์ดํ
์ ๋ํ ์์ ์ ์ ํธ๋๋ฅผ ์ง์ ํํํ๋ ์ํ๋ฅผ Explicit์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋์ ์์ผ๋ก ํ์
ํํฐ๋ง ์์ ์์๋ ์ฌ์ฉ์๋ค์ด ๊ฐ๊ฐ์ ์์ดํ
์ ๋ํด์ 1~10์ ์ ์ ์๋ฅผ ๋งค๊ธฐ๊ฒ ๋๋ฉฐ ๋ช๋ช ์์ดํ
์ ๋ํด์๋ ์ ์๊ฐ ์๋ ํํ, ์ฆ ์์ดํ
์ ๊ตฌ๋งคํ์ง ์์ ?๊ฐ ๋์ค๋ ํํ๋ฅผ ๋๊ฒ ๋ ๊ฒ์ด๋ค. ์ด๋ ์ฐ๋ฆฌ๋ ๊ตฌ๋งคํ์ง ์์์ผ๋ ์ด์๊ธฐ๋ฐ ๋ชจ๋ธ์ ํตํด ์ด๋ค ํ์ ์ ๊ฐ์ง์ง ์์ธกํ์ฌ ?์ ๋ค์ด๊ฐ ๊ฐ์ ์ฐพ์ ์ ์๋ค.
ย
3) ์ต๊ทผ์ ์ด์๊ธฐ๋ฐ ํ์ ํํฐ๋ง(Neighborhood based Collaborative Filtering)
(1) ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง๊ณผ ์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง ๊ธฐ๋ณธ ์์
๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ธ ์ต๊ทผ์ ์ด์๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ํ์
ํํฐ๋ง์ ์ํด์ ๊ฐ๋ฐ๋ ์ด๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก์ ํฌ๊ฒ ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง๊ณผ ์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง ๋ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค. ๋จผ์ ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง(User-based collaborative filtering)์ ํด๋น ์ฌ์ฉ์์ ๊ตฌ๋งค ํจํด ๋ฐ ํ์ ์ด ๋น์ทํ ์ฌ์ฉ์๋ฅผ ์ฐพ์ ์ด ๋น์ทํ ์ฌ์ฉ์๊ฐ ๋ณธ ์์ดํ
์ผ๋ก ์ถ์ฒ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ค. ์ฆ, ์์ดํ
์ ์ถ์ฒํด์ค ๋ โ์ ์ฌํ ์ฌ๋โ์ ์ฐพ๋๋ค๋ ๊ฒ์ด ํต์ฌ์ด๋ค. ์๋์ User-based filtering ์์ ์์๋ ๋ณผ ์ ์๋ฏ์ด, ์ธ ๋ฒ์งธ ์ฌ์ฉ์๊ฐ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์์ 50%(2/4) ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ์ธ ๋ฒ์งธ ์ฌ์ฉ์์ ์ ์ฌํ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์๊ฐ ๋ณธ ํฌ๋์ ์ค๋ ์ง๋ผ๋ ์์ดํ
์ ์ธ ๋ฒ์งธ ์ฌ์ฉ์์๊ฒ ์ถ์ฒํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด์ ๋ฌ๋ฆฌ ์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง(Item-based collaborative filtering)์ ํด๋น ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ํ์ ์ ์ค ์์ดํ
๊ณผ ์ ์ฌํ ์์ดํ
์ ์ฐพ์์ ์ถ์ฒ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ค. ์ฆ ์ถ์ฒ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด โ์ ์ฌํ ์์ดํ
โ์ ์ฐพ๋ ๊ฒ์ด ํต์ฌ์ด๋ค. Item-based filtering ์์ ๋ฅผ ๋ณด๋ฉด, ์ธ ๋ฒ์งธ ์ฌ์ฉ์๋ ์๋ฐ์ด๋ผ๋ ์์ดํ
์ ๋ณด์๊ณ ์ด๋ฅผ ๋ณธ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์์ ๋ ๋ฒ์งธ ์ฌ์ฉ์๋ ๋ชจ๋ ํฌ๋๋ผ๋ ์์ดํ
์ญ์ ๋ณด์๋ค. ๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์์ ๋ ๋ฒ์งธ ์ฌ์ฉ์๊ฐ ๋ณธ ํฌ๋๋ผ๋ ์์ดํ
์ ์๋ฐ์ด๋ผ๋ ์์ดํ
๊ณผ ์ ์ฌํ๋ค๊ณ ํ๋จํ์ฌ ์ด๋ฅผ ์ธ ๋ฒ์งธ ์ฌ์ฉ์์๊ฒ ์ถ์ฒํด์ฃผ๋ ๊ฒ์ด๋ค.
ย
(2) ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง(User-based collaborative filtering)์์ ? ๊ตฌํ๊ธฐ
๋ฐ๋ก ์์์ ๋งํ ๊ฒ์ฒ๋ผ ?๋ ์ด๋ค ํ์ ์ ๊ฐ์ง์ง ์์ธกํ์ฌ, ์ ์ฌ๋๋ฅผ ๊ตฌํด ์ฐพ์ ์ ์๋ค. ๋ฐ๋ผ์ ์ผ๋จ ๋์ ์๋ ํ์์ ?๋ ๋ฌด์ํ ์ฑ ์๋ ์ ๋ณด๋ค์ ํตํด์ Cosine ์ ์ฌ๋์ Pearson ์ ์ฌ๋๋ฅผ ๊ตฌํ๋ค. ์ด๋ ์ฌ์ฉ์3์ ์์ดํ
1์์ ์ด๊ฒ์ด ์ฌ์ฉ์1, ์ฌ์ฉ์2์ ๋น์ทํ ์ ํธ๋ฅผ ๋ณด์ธ๋ค๊ณ ์๊ฐํด ์ด๋ฅผ ํตํด
?๋ฅผ ์์ธกํด๋ณด์. ์ด๋ค์ ์์ดํ
1์ ๊ฐ๊ฐ 7์ ๊ณผ 6์ ์ด๋ฏ๋ก ? ์ญ์ 6~7์ ์ ๋์ ์์ค์ ๋ณด์ผ ๊ฒ์ด๊ณ , ์ฌ์ฉ์3 ์ญ์ ์์ดํ
1์ ๋ง์ด ๋ณผ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ์3์ ์์ดํ
6์์ ์ด๊ฒ์ด ์ฌ์ฉ์4, ์ฌ์ฉ์5์ ๋น์ทํ ์ ํธ๋ฅผ ๋ณด์ธ๋ค๊ณ ์๊ฐํด ์ด๋ฅผ ํตํด ?๋ฅผ ์์ธกํด๋ณด์. ์ด๋ค์ ์์ดํ
6์ ๊ฐ๊ฐ 4์ ๊ณผ 3์ ์ด๋ฏ๋ก ? ์ญ์ 3~4์ ์ ๋ฎ์ ์์ค์ ๋ณด์ผ ๊ฒ์ด๊ณ , ์ฌ์ฉ์3 ์ญ์ ์์ดํ
6์ ์ ๊ฒ ๋ณผ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์๋ค.
ย
(3) ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง(User-based collaborative filtering)์ ๋ฌธ์ ์ ๋ฐ ํด๊ฒฐ ๋ฐฉ์
๋ค๋ง ์ด๋ฌํ ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง์์๋ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ด ์๋ค. ์์ ํ์์ ์ฌ์ฉ์๋ง๋ค์ ํ๊ท ๊ฐ์ ๊ณ์ฐํด๋ณด๋ฉด ๊ฐ๊ฐ 5.5, 4.8, 2.0, 2.5, 2.0์ด ๋์ค๋๋ฐ ์ฌ์ฉ์1๊ณผ ์ฌ์ฉ์2๊ฐ ์ฌ์ฉ์3, ์ฌ์ฉ์4, ์ฌ์ฉ์5์ ๋นํด์ ํํ ํ์ ์ ์ฃผ๋ ๊ฒ์ ์ ์ ์๋ค. ์ฆ, ์ฌ์ฉ์1๊ณผ ์ฌ์ฉ์2๊ฐ ํ์ ์ ๋๊ฒ ์ฃผ์๋๋ฐ ์ด๊ฒ์ด ์ง์ง๋ก ์์ดํ
์ ์ข๋ค๊ณ ๋๊ปด์ ๋์ ํ์ ์ ์ค ๊ฒ์ธ์ง, ์๋๋ฉด ํํ ํ์ ์ ์ฃผ๋ ์ฌ์ฉ์์ด๊ธฐ ๋๋ฌธ์ ํ์ ์ ๋๊ฒ ์ฃผ์ด์ ํธ์ฐจ๊ฐ ์๊ธด ๊ฒ์ธ์ง์ ๋ํ ์๊ตฌ์ฌ์ด ๋ค ์ ์๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ํธํฅ์ ์ ๊ฑฐํ ํ์๊ฐ ์กด์ฌํ๋ค. ์ฌ์ฉ์ ๊ฐ์ ํธํฅ์ ์ ๊ฑฐํ๊ธฐ ์ํ ์์ ์๋์ ๊ฐ์๋ฐ, ์์ดํ
์ ํ์ ์์ ์ฌ์ฉ์์ ํ๊ท ํ์ ์ ๋บ ๋ค ํผ์ด์จ ์ ์ฌ๋๋ฅผ ๊ณฑํ์ฌ ๊ฐ์คํ๊ท ์ ๊ตฌํ๋ฉด ํธํฅ์ ์ ๊ฑฐํ ํ์ ์ ๊ตฌํ ์ ์๋ค.
ex) ์ฌ์ฉ์3์ ์์ดํ
1 ํ์
์ฌ์ฉ์3์ ์์ดํ
1 ํ์ = ์ฌ์ฉ์3์ ํ๊ท ํ์ + [(์ฌ์ฉ์1์ ์์ดํ
1 ํ์ - ์ฌ์ฉ์1์ ํ๊ท ํ์ ) โจฏ ์ฌ์ฉ์1์ ํผ์ด์จ ์ ์ฌ๋ + (์ฌ์ฉ์2์ ์์ดํ
1 ํ์ - ์ฌ์ฉ์2์ ํ๊ท ํ์ ) โจฏ ์ฌ์ฉ์2์ ํผ์ด์จ ์ ์ฌ๋] / [์ฌ์ฉ์1์ ํผ์ด์จ ์ ์ฌ๋ + ์ฌ์ฉ์2์ ํผ์ด์จ ์ ์ฌ๋]
ย
(4) ์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง(Item-based collaborative filtering)
์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ด๋ ๋ง๊ทธ๋๋ก ์์ดํ
๊ฐ์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ฌ๋์ ํธํฅ์ ์ ๊ฑฐํ์ฌ ๊ฐ์คํ๊ท ์ ๊ตฌํ ์ ์๋ค. ์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ด ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง๊ณผ ๋ค๋ฅธ ์ ์ ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ด ์ฌ์ฉ์ ๊ฐ์ ๋น๊ต๋ฅผ ํ๋ค๋ฉด, ์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ์ฌ๋ฌ ์ฌ์ฉ์ ๋ฌถ์์์ ์์ดํ
์ ๊ธฐ์ค์ผ๋ก ํ๋์ ์์ดํ
๊ณผ ๋ค๋ฅธ ์์ดํ
์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ด๋ค.
ย
(5) ์ต๊ทผ์ ์ด์๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ์ ๊ทผ ๋ฐฉ์์ด ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌํ ๋ฐ ๋๋ฒ๊ทธ๊ฐ ์ฝ๋ค.
- ๋น์ทํ ์ฌ์ฉ์๋ฅผ ๋จผ์ ์ฐพ์ ๋ค์ ์ด ๋น์ทํ ์ฌ์ฉ์๋ฅผ ๋ช ๋ช ์ด๋ ์ ํํ ์ง K๋ฅผ ํตํด ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ดํ ์ถ์ฒ์ ์ด์ ๊ฐ ์ ๋นํ๋ค.
- ๊ฐ์ ์ด์ ๋ก ์์ดํ ๊ธฐ๋ฐ ํ์ ํํฐ๋ง์ ํด์ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
- ์ถ์ฒ ๋ฆฌ์คํธ์ ์๋ก์ด ์์ดํ ๊ณผ ์ฌ์ฉ์๊ฐ ์ถ๊ฐ๋๋๋ผ๋ ์๋์ ์ผ๋ก ๋ชจ๋ธ์ด ํฌ๊ฒ ๋ฐ๋์ง ์์ ์์ ์ ์ด๋ค.
๋จ์
- ์ฌ์ฉ์ ๊ธฐ๋ฐ ํ์ ํํฐ๋ง์์ ์๊ฐ๊ณผ ์๋, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ํ์ํ๋ค.
- ํฌ์์ฑ ๋๋ฌธ์ ์ ํ ๋ฒ์๊ฐ ์๊ธด๋ค. ์ฆ, ์ฌ๋๋ค์ด ๋ง์ด ๋ณด๋ ์ํ์ ๋ง์ด ๋ณด๊ณ ์ ๊ฒ ๋ณด๋ ์ํ์ ์ ๊ฒ ๋ด์ ๋ง์ด ๋ณด๋ ์ํ ์์ฃผ๋ก ์ถ์ฒ์ด ์งํ๋ ์๋ฐ์ ์์ผ๋ฉฐ, ์ด๋ค ์์ดํ ์ ๋ํด์ ์๋ฌด๋ ํ๊ฐ๋ฅผ ๋ด๋ฆฌ์ง ์๋๋ค๋ฉด ๊ทธ ์์ดํ ์ ๋ํด์๋ ํ์ ์์ธก์ด ๋ถ๊ฐ๋ฅํ๋ค.
โก๏ธย ๋ฐ๋ผ์ ์ปจํ
์ธ ๊ธฐ๋ฐ ์ถ์ฒ ์์คํ
์ ํจ๊ป ํ์ฉํด์ผ ํ๋ค!
ย
4) ์ ์ฌ ์์ธ๊ธฐ๋ฐ ํ์ ํํฐ๋ง(Latent Factor Collaborative Filtering)
(1) ์ด์๊ธฐ๋ฐ ํ์
ํํฐ๋ง๊ณผ์ ์ฐจ์ด์ ์ผ๋ก ๋ณธ ์ ์ฌ ์์ธ๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ์ ์์ ์๋ฆฌ
์ด์๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ์์ดํ
์ ๋ฒกํฐ์ ์ฌ์ฉ์ ์คํ์ด์ค์ ๋ฒกํฐ ๊ฐ์ ์กฐํฉ์ ํตํด ์์ดํ
๊ฐ์ ์ ์ฌ๋๋ฅผ ํตํด ์์ดํ
์ ๊ธฐ๋ฐ์ผ๋ก ์ถ์ฒํ๊ฑฐ๋ ์ฌ์ฉ์ ๊ฐ์ ๋ฒกํฐ ์ ์ฌ๋๋ฅผ ํตํด ์ถ์ฒ์ ์งํํ๋ค. ์ด์ ๋ฌ๋ฆฌ ์ ์ฌ ์์ธ๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ์ฌ์ฉ์ ๊ฐ์ ์คํ์ด์ค์ ์์ดํ
์คํ์ด์ค ๋ ๊ฐ์ง๋ฅผ ๋ง๋ค๊ณ ์ด๋ค์ ๊ณฑ์ ํตํด ์ถ์ฒ์ ์งํํ๋ค.
์ ์ฌ ์์ธ๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ์ฌ์ฉ์ ๋งคํธ๋ฆญ์ค์ ์์ดํ
๋งคํธ๋ฆญ์ค๋ผ๋ ๋ ๊ฐ์ง ํ๋ ฌ์ ๋์
ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ฐ๊ฐ์ ์์ธ๋ค์ด ์ ํํ๊ฒ ๋ฌด์์ ์๋ฏธํ๋์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ โ์ ์ฌ ์์ธ๊ธฐ๋ฐโ ํ์
ํํฐ๋ง์ด๋ผ๊ณ ํ๋ฉฐ ๊ฐ ์ฌ์ฉ์์ latent matrix์ ์์ดํ
์ latent matrix๋ฅผ ๊ณฑํ์ ๋ ํ์ ๋งคํธ๋ฆญ์ค๋ฅผ ๋ณต์ํ ์ ์๋ค.
์ ์ฌ ์์ธ๊ธฐ๋ฐ ํ์
ํํฐ๋ง์ ์๋ฆฌ๋ก๋ ๋ทํ๋ฆญ์ค์์ ์ฌ์ฉํ๋ SVD, ๊ฐ์ค์น๋ฅผ ์ฃผ๋ Weighted ๋ฑ์ด ์์ผ๋ ์ด๋ฒ ๊ธ์์๋ SGD์ ALS์ ๋ํด์ ๋ค๋ค๋ณด๊ณ ์ ํ๋ค.
ย
(2) SGD์ ์ ์
SGD๋ ๊ณ ์ ๊ฐ ๋ถํด๋ฅผ ํตํด ํ๋ ฌ์ ๋๊ฐํํ๋ ๋ฐฉ์์ ์๋ฏธํ๋ฉฐ ๊ธฐ์กด์ ํ์ ๋งคํธ๋ฆญ์ค์ ์ฌ์ฉ์/์์ดํ
์ ๋ํ latent matrix์ ๊ณฑ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๋ํ๋ฌ๋ค. SGD๋ฅผ ํตํด ์ฌ์ฉ์ latent์ ์์ดํ
latent๋ฅผ ๊ณฑํ์ ๋ ํ์ ๋งคํธ๋ฆญ์ค๋ฅผ ๋ณต์ํ์ฌ ์ค์ ํ์ ๊ณผ์ ์ฐจ์ด๋ฅผ ์ค์ผ ์ ์๋ U์ V๋ฅผ ์ฐพ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค. U๋ฅผ ํธ๋ฏธ๋ถํ๋ฉด V์ ๋ํ ํจ์๊ฐ ๋์ถ๋๊ณ , V๋ฅผ ํธ๋ฏธ๋ถํ๋ฉด U์ ๋ํ ํจ์๊ฐ ๋์ถ๋๋ฉฐ U์ V๊ฐ ๊ณ์ ์
๋ฐ์ดํธ๋๋ ๊ณผ์ ์ ๊ฑฐ์ณ ์๊ณ ๋ฆฌ์ฆ์ด ๊ณ์ ๋ณ๋ํ๊ฒ ๋๋ค. ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์์ ์์์ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ SGD์๋ Regularization์ด๋ผ๋ ์ค์ํ ๋ฐฉ๋ฒ์ด ํ์ฉ๋๋ค. ์ด๋ ๊ณ ์ ๊ฐ ๋ถํด์ ๊ฐ์ ํ๋ ฌ์ ๋๊ฐํํ๋ ๋ฐฉ๋ฒ์ธ๋ฐ, Weight ๊ฐ์์ Regularization์ด ์์ผ๋ฉด ๊ฐ์ด ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ ์ฐ๋ ค๊ฐ ์์ด ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ๊ฐ ํฌ๊ธฐ์ ์ ๊ณฑ์ธ Regularization term์ ๋ํด์ค๋ค.
ย
(3) SGD์ ์ฅ์ ๊ณผ ๋จ์
์ฅ์
๋งค์ฐ ์ ์ฐํ๋ฉฐ, ๋ฅ๋ฌ๋์ ๋ชจ๋ ์ฅ์ ์ ๋๋ฃจ ๊ฐ์ง๊ณ ์๋ค.
๋จ์
์๋ ด ์๋๊ฐ ๋๋ฆฌ๋ค. ๋ค๋ง, ์ข์ ๋ฅ๋ฌ๋์ ์ฐ๋ฉด ์๋ ด ์๋๊ฐ ์ด๋์ ๋ ํ๋ณต๋๋ฉฐ parallelized๋ก ๋ถ์ํด์ ์ฐ๋ฉด ๋ ๋น ๋ฅด๋ค๊ณ ์๋ ค์ ธ ์๋ค.
ย
(4) ALS์ ์ ์์ ์๊ณ ๋ฆฌ์ฆ์ ํน์ง
ALS๋ ๋ ํ๋ ฌ ์ค ํ๋๋ฅผ ๊ณ ์ ํ๊ณ ๋ค๋ฅธ ํ๋์ ํ๋ ฌ์ ์์ฐจ์ ์ผ๋ก ๋ฐ๋ณตํ๋ฉด์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ํ๋์ latent๋ฅผ ๊ณ ์ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ๋๋ ๋ฌด์กฐ๊ฑด convexํ ํํ์ด๊ณ , ๋ฌด์กฐ๊ฑด ํ๋ ฌ์ ์๋ ดํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ฌ์ฉ์๋ฅผ ๊ณ ์ ํ๊ณ ์
๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์ ์์ดํ
์ ํ๋ ฌ์ ๊ณ ์ ํ๊ณ ์ฌ์ฉ์์ ํ๋ ฌ์ ์ต์ ํํ๊ฑฐ๋, ์ฌ์ฉ์์ ํ๋ ฌ์ ๊ณ ์ ํ๊ณ ์์ดํ
์ ํ๋ ฌ์ ์ต์ ํํ๋ ๋ฐฉ์์ ๋ฐ๋ณตํด์ ์งํํ๋ค. ์ด ๊ณผ์ ์์ ์์ด ๋ชจ๋ convex์ ํํ๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์ ์๋ ด๋ ํ๋ ฌ์ ์ ๋ต์ ์ฐพ์ ์ ์๋ค. ํนํ ์์์๋ ?๋ฅผ ๋ชจ๋ ๋น์ฐ๊ณ ๊ณ์ฐ์ ์งํํ์ผ๋ ALS์์๋ ?๋ฅผ ๋ชจ๋ 0์ผ๋ก ์ฒ๋ฆฌํ๊ณ ํ์ตํ๋ค๋ ํน์ด์ ์ด ์๊ณ ๊ณ ์ ์ํค๋ ๋ถ๋ถ ์ธ์๋ SGD์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ ๋ฐฉ์์ด๋ค.
ย
ย
SGD ์ฝ๋
import numpy as np from tqdm import tqdm_notebook as tqdm import numpy as np # Base code : https://yamalab.tistory.com/92 class MatrixFactorization(): def __init__(self, R, k, learning_rate, reg_param, epochs, verbose=False): """ :param R: rating matrix :param k: latent parameter :param learning_rate: alpha on weight update :param reg_param: beta on weight update :param epochs: training epochs :param verbose: print status """ self._R = R # ํ์ ํ๋ ฌ self._num_users, self._num_items = R.shape self._k = k # user latent์ item latent์ ์ฐจ์ ์ self._learning_rate = learning_rate # ํ์ต๋ฅ self._reg_param = reg_param # weight์ regularization ๊ฐ self._epochs = epochs # ์ ์ฒด ํ์ต ํ์ self._verbose = verbose # ํ์ต ๊ณผ์ ์ ์ถ๋ ฅํ ์ง ์ฌ๋ถ def fit(self): """ training Matrix Factorization : Update matrix latent weight and bias ์ฐธ๊ณ : self._b์ ๋ํ ์ค๋ช - global bias: input R์์ ํ๊ฐ๊ฐ ๋งค๊ฒจ์ง rating์ ํ๊ท ๊ฐ์ global bias๋ก ์ฌ์ฉ - ์ ๊ทํ ๊ธฐ๋ฅ. ์ต์ข rating์ ์์๊ฐ ๋ค์ด๊ฐ๋ ๊ฒ ๋์ latent feature์ ์์๊ฐ ํฌํจ๋๋๋ก ํด์ค. :return: training_process """ # latent matrix ์ด๊ธฐํ self._P = np.random.normal(size=(self._num_users, self._k)) self._Q = np.random.normal(size=(self._num_items, self._k)) # bias ์ด๊ธฐํ self._b_P = np.zeros(self._num_users) self._b_Q = np.zeros(self._num_items) self._b = np.mean(self._R[np.where(self._R != 0)]) # train while epochs self._training_process = [] for epoch in range(self._epochs): # rating์ด ์กด์ฌํ๋ index๋ฅผ ๊ธฐ์ค์ผ๋ก training xi, yi = self._R.nonzero() for i, j in zip(xi, yi): self.gradient_descent(i, j, self._R[i, j]) cost = self.cost() self._training_process.append((epoch, cost)) # epoch์ cost๋ฅผ ์ ์ฅํ๋ ๋ถ๋ถ # print status if self._verbose == True and ((epoch + 1) % 10 == 0): print("Iteration: %d ; cost = %.4f" % (epoch + 1, cost)) def cost(self): """ compute root mean square error :return: rmse cost """ # xi, yi: R[xi, yi]๋ nonzero์ธ value๋ฅผ ์๋ฏธํ๋ค. # ์ฐธ๊ณ : http://codepractice.tistory.com/90 xi, yi = self._R.nonzero() # predicted = self.get_complete_matrix() cost = 0 for x, y in zip(xi, yi): cost += pow(self._R[x, y] - self.get_prediction(x, y), 2) return np.sqrt(cost/len(xi)) def gradient(self, error, i, j): """ gradient of latent feature for GD :param error: rating - prediction error :param i: user index :param j: item index :return: gradient of latent feature tuple """ dp = (error * self._Q[j, :]) - (self._reg_param * self._P[i, :]) dq = (error * self._P[i, :]) - (self._reg_param * self._Q[j, :]) return dp, dq # user latent matrix์ item latent matrix์ ๊ณฑ์ ํตํด ํ์ ํ๋ ฌ์ ๊ฐ์ ์์ฑ def gradient_descent(self, i, j, rating): """ graident descent function :param i: user index of matrix :param j: item index of matrix :param rating: rating of (i,j) """ # get error prediction = self.get_prediction(i, j) error = rating - prediction # update biases self._b_P[i] += self._learning_rate * (error - self._reg_param * self._b_P[i]) self._b_Q[j] += self._learning_rate * (error - self._reg_param * self._b_Q[j]) # update latent feature dp, dq = self.gradient(error, i, j) self._P[i, :] += self._learning_rate * dp self._Q[j, :] += self._learning_rate * dq def get_prediction(self, i, j): """ get predicted rating: user_i, item_j :return: prediction of r_ij """ return self._b + self._b_P[i] + self._b_Q[j] + self._P[i, :].dot(self._Q[j, :].T) def get_complete_matrix(self): """ computer complete matrix PXQ + P.bias + Q.bias + global bias - PXQ ํ๋ ฌ์ b_P[:, np.newaxis]๋ฅผ ๋ํ๋ ๊ฒ์ ๊ฐ ์ด๋ง๋ค bias๋ฅผ ๋ํด์ฃผ๋ ๊ฒ - b_Q[np.newaxis:, ]๋ฅผ ๋ํ๋ ๊ฒ์ ๊ฐ ํ๋ง๋ค bias๋ฅผ ๋ํด์ฃผ๋ ๊ฒ - b๋ฅผ ๋ํ๋ ๊ฒ์ ๊ฐ element๋ง๋ค bias๋ฅผ ๋ํด์ฃผ๋ ๊ฒ - newaxis: ์ฐจ์์ ์ถ๊ฐํด์ค. 1์ฐจ์์ธ Latent๋ค๋ก 2์ฐจ์์ R์ ํ/์ด ๋จ์ ์ฐ์ฐ์ ํด์ฃผ๊ธฐ์ํด ์ฐจ์์ ์ถ๊ฐํ๋ ๊ฒ. :return: complete matrix R^ """ return self._b + self._b_P[:, np.newaxis] + self._b_Q[np.newaxis:, ] + self._P.dot(self._Q.T) # run example if __name__ == "__main__": # rating matrix - User X Item : (7 X 5) R = np.array([ [1, 0, 0, 1, 3], [2, 0, 3, 1, 1], [1, 2, 0, 5, 0], [1, 0, 0, 4, 4], [2, 1, 5, 4, 0], [5, 1, 5, 4, 0], [0, 0, 0, 1, 0], ]) # P, Q is (7 X k), (k X 5) matrix
%%time factorizer = MatrixFactorization(R, k=3, learning_rate=0.01, reg_param=0.01, epochs=100, verbose=True) factorizer.fit()
factorizer.get_complete_matrix()