반응형
페이스북에서 대용량 벡터(Vectoer)의 유사도(Similarity)검색을 위한 오픈소스 Faiss를 공개하였는데요. SIFT데이터셋을 사용하여 데이터가 10만개일 때는 쿼리 속도가 20ug로 종전의 최고 성능과 유사하지만 데이터가 10억개일 때는 17.7us로 종전 최고 성능보다 8배 정보 빠르게 구현할 수 있다고 합니다.
아쉽게도 현재 Linux와 OSX(Mac)만을 지원하고 있습니다.
Faiss을 통해 K-Means를 빠르게 단 몇줄의 코딩으로 구현을 할 수 있게 됩니다.
faiss library를 설치합니다. faiss가 포함된 k-means는 일반적인 Scikit-Learn에 비해 매우 빠르게 실행이 됩니다.
import numpy as np
import faiss
class FaissKMeans:
def __init__(self, n_clusters=10, n_init=100, max_iter=300):
self.n_clusters = n_clusters
self.n_init = n_init
self.max_iter = max_iter
self.kmeans = None
self.cluster_centers_ = None
self.inertia_ = None
def fit(self, X, y):
self.kmeans = faiss.Kmeans(d=X.shape[1],
k=self.n_clusters,
niter=self.max_iter,
nredo=self.n_init)
self.kmeans.train(X.astype(np.float32))
self.cluster_centers_ = self.kmeans.centroids
self.inertia_ = self.kmeans.obj[-1]
def predict(self, X):
return self.kmeans.index.search(X.astype(np.float32), 1)[1]
- np.float32를 사용합니다. Faiss는 해당 type에서만 실행이 되니 프로그램시 해당 type만 사용하세요.
import faiss
import numpy as np
D = 128
N = 10000
K = 10 # The number of clusters
X = np.random.random((N, D)).astype(np.float32)
# Setup
kmeans = faiss.Kmeans(d=D, k=K, niter=20, verbose=True)
# For GPU(s), run the following line. This will use all GPUs
# kmeans = faiss.Kmeans(d=D, k=K, niter=20, verbose=True, gpu=True)
# Run clustering
kmeans.train(X)
# Error for each iteration
print(kmeans.obj) # array with 20 elements
# Centroids after clustering
print(kmeans.centroids.shape) # (10, 128)
# The assignment for each vector.
dists, ids = kmeans.index.search(X, 1) # Need to run NN search again
print(ids.shape) # (10000, 1)
# Params
print("D:", kmeans.d)
print("K:", kmeans.k)
print("niter:", kmeans.cp.niter)
반응형
'ML with SckitLearn' 카테고리의 다른 글
데이터 전처리하기 : 레이블 인코딩 (Label Encoding), 원-핫 인코딩(One-Hot Encoding), get_dummies()를 Pandas에서 사용하기 (0) | 2020.12.09 |
---|---|
K-Means 알고리즘의 원리와 이해 한판에 배워보기 (0) | 2020.12.05 |
머신러닝, 클러스터 가우시안 가상데이터 생성하는 make_blobs를 이용한 K-means 실습 (Elbow Method 사용) (0) | 2020.12.03 |
Light GBM(LGBM)의 개요와 파라미터 정의에 대해 (0) | 2020.11.19 |
로지스틱 회귀 : Logistic Regression, 시그모이드(sigmoid)를 이용한 분류 회귀 (0) | 2020.10.25 |
라쏘 / 엘라스틱넷 회귀 : Lasso / ElasticNet Model 이란? Scikit Learn에서의 실습 (0) | 2020.10.24 |
릿지 회귀 : Ridge Model 이란? Scikit Learn에서의 실습 (0) | 2020.10.24 |
Regulation(규제) 선형 모델에 대한 개요 - 릿지(Ridge), 라쏘(Lasso), 엘라스틱(Elastic Net) (0) | 2020.10.20 |