2021. 8. 14. 11:33ㆍAI/Machine learning
- 목차
Introduction
핵심 인물 찾기
핵심 인물 데이터
users = [ { "id": 0, "name": "Hero" }, { "id": 1, "name": "Dunn" }, { "id": 2, "name": "Sue" }, { "id": 3, "name": "Chi" }, { "id": 4, "name": "Thor" }, { "id": 5, "name": "Clive" }, { "id": 6, "name": "Hicks" }, { "id": 7, "name": "Devin" }, { "id": 8, "name": "Kate" }, { "id": 9, "name": "Klein" } ]
위 인물들의 친구 관계
friendship_pairs = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 4), (4, 5), (5, 6), (5, 7), (6, 8), (7, 8), (8, 9)]
- 모든 사람들의 친구 수를 계산하여 평균을 구함
- 가장 연결이 많은 node가 연결 중심성(degree centrality) 임
- 그러나 연결이 가장 많은 node가 network 상의 중심 위치에 위치하지 않을 수 있음
데이터 과학자 추천
- 추천 방식
- 친구의 친구들에 대해 친구 추천
- 서로 함께 아는 친구
- 비슷한 관심사로 추천
interests = [
(0, "Hadoop"), (0, "Big Data"), (0, "HBase"), (0, "Java"),
(0, "Spark"), (0, "Storm"), (0, "Cassandra"),
(1, "NoSQL"), (1, "MongoDB"), (1, "Cassandra"), (1, "HBase"),
(1, "Postgres"), (2, "Python"), (2, "scikit-learn"), (2, "scipy"),
(2, "numpy"), (2, "statsmodels"), (2, "pandas"), (3, "R"), (3, "Python"),
(3, "statistics"), (3, "regression"), (3, "probability"),
(4, "machine learning"), (4, "regression"), (4, "decision trees"),
(4, "libsvm"), (5, "Python"), (5, "R"), (5, "Java"), (5, "C++"),
(5, "Haskell"), (5, "programming languages"), (6, "statistics"),
(6, "probability"), (6, "mathematics"), (6, "theory"),
(7, "machine learning"), (7, "scikit-learn"), (7, "Mahout"),
(7, "neural networks"), (8, "neural networks"), (8, "deep learning"),
(8, "Big Data"), (8, "artificial intelligence"), (9, "Hadoop"),
(9, "Java"), (9, "MapReduce"), (9, "Big Data")
]
특정 관심사를 공유하는 사용자를 찾아서 추천
- 단순하게 같은 흥미 '1'개 를 공유하는 친구를 추천
- 여러 흥미들로 하나의 feature space를 만들고 각각의 사람들의 feature vector를 가지고 추천
- 이 때 feature vector간의 '유사도'를 가지고 추천
- '유사도' 계산 알고리즘
유사도 계산
백터간의 내적 혹은 Euclidean distance로 유사도를 측정
이외 cosine similarity 등을 사용
cosine similarity
두 vector가 가리키는 방향(각도)이 얼마나 비슷한지 정도
1: 동일
-1: 완전 반대
0: 직교
세타 방향의 유사도
내각인 경우 유효
둔각인 경우 부정 (반대적 측면으로 유효)
계산 방법
similarity = cos(θ) = A ⋅ B ----- ||A|| |B|| = ∑ i=1~n Ai x Bi ---------------- sqrt(∑ i=1~n Ai^2) x sqrt(∑ i=1~n Bi^2)
Jaccard similarity
교집합의 크기 / 합집합의 크기
평점 정보를 보지 않아 부정확
Pearson correlation coefficient
cosine similarity와 유사하나, 평점에서 평균을 뺀 값을 사용함
유사도 적용 예
Content based filtering
고전적 추천 방식 중 content-based filtering이란 방식이 있다.
이 방식은 사용자가 높은 평점을 내린 item과 유사한 item을 추천하는 것이다.
유사한 item을 찾아야 하는데, 이 때 content의 유사도를 계산한다.
예를들어 video content의 경우 유사성을 계산하는데 사용될 수 있는 feature를 정의한다.
ex. genre, actors, actress, director, production 등이 content의 feature가 될 수 있다.
content 자체만을 보고 추천하기에, 다음과 같은 장/단점이 존재한다.
장점
- 많은 사용자 정보가 필요하지 않다.
- 본인의 score를 가지고 추천이 가능하다.
- 다른 사람은 좋아하지 않아도 자신의 선호도를 바탕으로 추천한다.
- 새로운(유사) 제품을 추천할 수 있다.
- 왜 좋아하는지도 설명이 가능하다.
- 많은 사용자 정보가 필요하지 않다.
단점
- 특징을 추출해야 한다.
- cold-start 문제가 있다.
- 사용자가 최초 어떠한 제품에도 score를 매기지 않은 상태라면 추천이 불가능하다.
- over-fitting
- 유사 제품만 추천하게 된다.
- 미경험 제품은 추천하지 못한다. (serendipity를 줄 수 없다)
Collaborative Filtering
serendipity를 좀 더 부여할 수 있는 방법이다.
사용자의 collaborative를 보는 방법과 item의 collaborative를 보는 두 가지 방법이 존재한다.
user-user CF
나와 유사하게 item을 평점한 user를 찾아 그 user의 평점으로 나의 평점을 예측한다.
rx = {1,0,4,0,1} # 0은 평점 안 한 것
ry = {4,0,2,3,0}
- 유사성 확인
rxi: 사용자 x가 item i에 대해 매기는 예측값
N: item i에 대해 평점내린 나와 유사한 users
rxi = 1/k ∑ ryi
- N 내 user들의 i에 대한 평점의 평균으로 나의 i 평점을 예측
rxi = ∑ Sxy ryi / ∑ Sxy
분모: weight 합이 1이 되게 함
Sxy: sim(x,y)
사람간의 유사도로 가중치 부여
item-item CF
이전에는 user의 item들에 대한 score가 feature vector 였다면,
이번에는 item을 user들이 score한 것이 feature vector이다.
user 별로 score가 비슷하게 매겨지는 item을 추천한다.
개개인만의 score를 보고 추천하는 것이 아니다.
item의 feature vector는 각 user들의 rating이다
∑ Sij: sim(i,j) item i와 j의 유사도
item 별 유사도를 계산
item의 feature vector는 각 user들의 rating
즉, item의 space는 user로 구성됨
CF pros/cons
차원 문제
- 차원이 item의 수 혹은 user의 수이므로, 상당함
pros
- 어떤 item에 대해서도 동작
- 평점 정보만 있으면 됨 (feature design 필요 없음)
- 보통 가장 좋은 성능의 기법
cons
- cold-start
- sparsity
- 같은 item에 대해 평점을 내린 사용자를 찾기 어려움
- cold-start 문제 피하기
- 사용자 정보 기반 추천
- ex. 음악의 경우 좋아하는 장르, 가수등을 입력하게 유도
- 사용자 정보 기반 추천
- 문서와 같이 비정형 데이터의 경우 feature를 어떻게 찾나?
이 경우 feature를 추출해야 하는데, 이를 topic이라 한며,
topic을 추출할 수 있는 알고리즘을 사용한다.
TF-IDF가 topic을 찾는 방법이다.
상관관계 분석
연봉과 경력
salaries_and_tenures = [(83000, 8.7), (88000, 8.1),
(48000, 0.7), (76000, 6),
(69000, 6.5), (76000, 7.5),
(60000, 2.5), (83000, 10),
(48000, 1.9), (63000, 4.2)]
scatter plot(산포도)를 그려보면, 선형성이 관찰된다.
상관계수를 구해보자
표본분산
- 각 sample 값 - 표본평균의 합에 평균 (단, 평균 계산 시 n으로 나누지 않고 n - 1로 나눔)
- -1은 자유도
- 모수의 분산은 n으로 나눔
- 표본의 분산은 n - 1로 나눔
- 마지막 값은 합을 0으로 만들기에 (즉, 정보량이 없기에) 빼기 때문임
- -1은 자유도
- 각 sample 값 - 표본평균의 합에 평균 (단, 평균 계산 시 n으로 나누지 않고 n - 1로 나눔)
표준편차
- 분산의 단위는 제곱이라, 원래 sample의 단위와 다름
- 단위를 다시 원래 sample 단위로 옮기기 위해 root를 적용
표준화
- 각 sample에서 평균을 빼고, 표준편차로 나눔
- 표준화 한 평균과 분산은 각각 0과 1
- 이로서 측정 단위에 영향을 받지 않고 절대비교가 가능
공분산
- 두 변수의 분산
- (xi - xbar) x (yi - ybar)의 평균임
- 사실 분산과 의미가 전혀 다름
- 문제
- 측정 단위에 영향을 받기에 값 자체로 선형관계의 정도를 알 수 없음
- 이를 해결하기 위해 표준화 를 사용
- 표준화 방법 (피어슨의 표본상관계수)
- 각 term을 표준편차로 나눔
- (xi - xbar)/Sx * (yi - ybar)/
- 측정 단위에 영향을 받기에 값 자체로 선형관계의 정도를 알 수 없음
(피어슨의) 표본상관계수의 성질
- 피어슨 상관계수
- |r| = 1
- 완벽한 상관관계가 있음
- |r| = 0
- 상관관계가 없음
- 1 ~ 0.7: 매우 강한 상관관계 (음수일 경우 강한 음의 상관관계)
- 0.7 ~ 0.3: 강한 상관관계
- 0.3 ~ 0.1: 약한 상관관계
- 0.1 ~ -0.1: 상관 없음
- 상관관계가 없음
- |r| = 1
- 피어슨 상관계수
자 이제 표본상관계수를 구해본다.
'AI > Machine learning' 카테고리의 다른 글
LDA Latent Dirichlet Allocation (0) | 2021.08.16 |
---|---|
LSA Latent Semantic Analysis (0) | 2021.08.16 |
특징 생성 (0) | 2021.08.14 |
모델 평가 지표 (0) | 2021.08.14 |
Data Science: 자연어 처리 (Natural Language Processing) (0) | 2021.08.14 |