Загрузить файлы в «/»
This commit is contained in:
parent
0c48feaf0d
commit
2bf799165b
93
IFVADC-EUCLIDIAN.py
Normal file
93
IFVADC-EUCLIDIAN.py
Normal file
@ -0,0 +1,93 @@
|
||||
from tslearn.clustering import TimeSeriesKMeans
|
||||
from tslearn.metrics import lb_keogh as Keogh
|
||||
|
||||
from numpy.linalg import norm
|
||||
|
||||
class IVFADC_EUCLIDIAN():
|
||||
def k_means(X,n,iter):
|
||||
model = TimeSeriesKMeans(n_clusters=n, metric="euclidean",random_state=0,max_iter=iter)
|
||||
model.fit(X)
|
||||
cluster=model.cluster_centers_
|
||||
clusters=[]
|
||||
for c in cluster:
|
||||
c=list(c.reshape(1,-1))
|
||||
c=c[0]
|
||||
clusters.append(c)
|
||||
clusters=np.array(clusters)
|
||||
return clusters
|
||||
|
||||
def PQ(X,main_clusters,n_clusters,m_clusters,m):
|
||||
database=[[] for _ in range(n_clusters)]
|
||||
subvectors = [] # подвекторы
|
||||
nn_main_res = [] # чтобы знать результаты поиска главных центроидов
|
||||
nn = NearestNeighbors(n_neighbors=n_clusters,metric='euclidean') # создаем поиск ближайших главных центроидов
|
||||
nn.fit(main_clusters) # обучаем его
|
||||
for x in X: # для каждого вектора в X
|
||||
res=nn.kneighbors([x],n_neighbors=n_clusters,return_distance=False) # находим ближайший к нему центроид
|
||||
res=res[0][0]
|
||||
nn_main_res.append(res) # заносим результат во временное хранилище
|
||||
x-=main_clusters[res] # вычисляем остаток
|
||||
D = len(x)
|
||||
assert D % m == 0
|
||||
D_ = int(D / m)
|
||||
x_sub = [x[row:row+D_] for row in range(0, D, D_)] # делаем нарезку
|
||||
for sub in x_sub:
|
||||
subvectors.append(sub) # добавляем подвекторы в общую базу
|
||||
del x_sub,D,D_,res,nn,X
|
||||
subvectors=np.array(subvectors)
|
||||
print(len(nn_main_res))
|
||||
print('Подвекторы созданы')
|
||||
sub_clusters=IVFADC_EUCLIDIAN.k_means(subvectors,m_clusters,10) # создаем кластеры для подвекторов
|
||||
print('Кластеры для подвекторов созданы')
|
||||
nn = NearestNeighbors(n_neighbors=m_clusters,metric='euclidean') # создаем поиск ближайших подцентроидов
|
||||
nn.fit(sub_clusters) # учим его
|
||||
print('NN для подкластеров создан')
|
||||
code=[] # переменная для формирования кода PQ
|
||||
q=0
|
||||
k=0
|
||||
print(len(subvectors))
|
||||
for sub in subvectors:
|
||||
k+=1
|
||||
res=nn.kneighbors([sub],n_neighbors=m_clusters,return_distance=False) # находим ближайший центроид
|
||||
res=res[0][0]
|
||||
if k!=m:
|
||||
code.append(res) # формируем код
|
||||
else:
|
||||
code.append(res)
|
||||
ind = nn_main_res[q]
|
||||
database[ind].append([q,code])
|
||||
print(q,code,m)
|
||||
code=[]
|
||||
q+=1
|
||||
k=0
|
||||
return database, sub_clusters
|
||||
def Euclidian_dist(A,B):
|
||||
s=0
|
||||
for i in range(len(A)):
|
||||
s+=(A[i]-B[i])**2
|
||||
return s**(1/2)
|
||||
def train(X,n_clusters,m_clusters,m):
|
||||
main_clusters=IVFADC_EUCLIDIAN.k_means(X,n_clusters,30)
|
||||
print('Главные кластеры созданы')
|
||||
database,sub_clusters=IVFADC_EUCLIDIAN.PQ(X,main_clusters,n_clusters,m_clusters,m)
|
||||
return [main_clusters,sub_clusters,database]
|
||||
def predict(x,w,k,m,index):
|
||||
nn = NearestNeighbors(n_neighbors=w,metric='euclidean') # создаем поиск ближайших главных центроидов
|
||||
nn.fit(index[0]) # обучаем его
|
||||
res=nn.kneighbors([x],n_neighbors=w,return_distance=False) # находим ближайшие w центроидов
|
||||
res=res[0]
|
||||
v_dists=[]
|
||||
for r in res:
|
||||
remain=x-np.array(index[0][r])
|
||||
D = len(remain)
|
||||
D_ = int(D/m)
|
||||
x_sub = [remain[row:row+D_] for row in range(0, D, D_)] # делаем нарезку получаем векторы w векторов разбитых на 11 подвекторов длинной 5
|
||||
for vector in index[2][r]:
|
||||
dist=0
|
||||
code=vector[1]
|
||||
for i in range(len(code)):
|
||||
dist+=IVFADC_EUCLIDIAN.Euclidian_dist(x_sub[i],index[1][code[i]])
|
||||
v_dists.append([vector[0],dist])
|
||||
v_dists=sorted(v_dists, key=lambda x: x[1])
|
||||
v_dists=v_dists[:k]
|
||||
return v_dists
|
91
IVFADC-DTW.py
Normal file
91
IVFADC-DTW.py
Normal file
@ -0,0 +1,91 @@
|
||||
from tslearn.clustering import TimeSeriesKMeans
|
||||
from tslearn.metrics import lb_keogh as Keogh
|
||||
from sklearn.neighbors import KNeighborsClassifier,NearestNeighbors
|
||||
from numpy.linalg import norm
|
||||
from tslearn.metrics import dtw
|
||||
|
||||
class IVFADC_DTW():
|
||||
def k_means(X,n,iter):
|
||||
model = TimeSeriesKMeans(n_clusters=n, metric='dtw',random_state=0,max_iter=iter)
|
||||
model.fit(X)
|
||||
cluster=model.cluster_centers_
|
||||
clusters=[]
|
||||
for c in cluster:
|
||||
c=list(c.reshape(1,-1))
|
||||
c=c[0]
|
||||
clusters.append(c)
|
||||
clusters=np.array(clusters)
|
||||
return clusters
|
||||
def dtw(A,B):
|
||||
return dtw(A, B, global_constraint="itakura", itakura_max_slope=2.)
|
||||
def PQ(X,main_clusters,n_clusters,m_clusters,m):
|
||||
database=[[] for _ in range(n_clusters)]
|
||||
subvectors = [] # подвекторы
|
||||
nn_main_res = [] # чтобы знать результаты поиска главных центроидов
|
||||
nn = NearestNeighbors(n_neighbors=n_clusters,metric=IVFADC_DTW.dtw) # создаем поиск ближайших главных центроидов
|
||||
nn.fit(main_clusters) # обучаем его
|
||||
for x in X: # для каждого вектора в X
|
||||
res=nn.kneighbors([x],n_neighbors=n_clusters,return_distance=False) # находим ближайший к нему центроид
|
||||
res=res[0][0]
|
||||
nn_main_res.append(res) # заносим результат во временное хранилище
|
||||
x-=main_clusters[res] # вычисляем остаток
|
||||
D = len(x)
|
||||
assert D % m == 0
|
||||
D_ = int(D / m)
|
||||
x_sub = [x[row:row+D_] for row in range(0, D, D_)] # делаем нарезку
|
||||
for sub in x_sub:
|
||||
subvectors.append(sub) # добавляем подвекторы в общую базу
|
||||
del x_sub,D,D_,res,nn,X
|
||||
subvectors=np.array(subvectors)
|
||||
print(len(nn_main_res))
|
||||
print('Подвекторы созданы')
|
||||
sub_clusters=IVFADC_DTW.k_means(subvectors,m_clusters,10) # создаем кластеры для подвекторов
|
||||
print('Кластеры для подвекторов созданы')
|
||||
nn = NearestNeighbors(n_neighbors=m_clusters,metric=IVFADC_DTW.dtw) # создаем поиск ближайших подцентроидов
|
||||
nn.fit(sub_clusters) # учим его
|
||||
print('NN для подкластеров создан')
|
||||
code=[] # переменная для формирования кода PQ
|
||||
q=0
|
||||
k=0
|
||||
print(len(subvectors))
|
||||
for sub in subvectors:
|
||||
k+=1
|
||||
res=nn.kneighbors([sub],n_neighbors=m_clusters,return_distance=False) # находим ближайший центроид
|
||||
res=res[0][0]
|
||||
if k!=m:
|
||||
code.append(res) # формируем код
|
||||
else:
|
||||
code.append(res)
|
||||
ind = nn_main_res[q]
|
||||
database[ind].append([q,code])
|
||||
print(q,code,m)
|
||||
code=[]
|
||||
q+=1
|
||||
k=0
|
||||
return database, sub_clusters
|
||||
|
||||
def train(X,n_clusters,m_clusters,m):
|
||||
main_clusters=IVFADC_DTW.k_means(X,n_clusters,30)
|
||||
print('Главные кластеры созданы')
|
||||
database,sub_clusters=IVFADC_DTW.PQ(X,main_clusters,n_clusters,m_clusters,m)
|
||||
return [main_clusters,sub_clusters,database]
|
||||
def predict(x,w,k,m,index):
|
||||
nn = NearestNeighbors(n_neighbors=w,metric=IVFADC_DTW.dtw) # создаем поиск ближайших главных центроидов
|
||||
nn.fit(index[0]) # обучаем его
|
||||
res=nn.kneighbors([x],n_neighbors=w,return_distance=False) # находим ближайшие w центроидов
|
||||
res=res[0]
|
||||
v_dists=[]
|
||||
for r in res:
|
||||
remain=x-np.array(index[0][r])
|
||||
D = len(remain)
|
||||
D_ = int(D/m)
|
||||
x_sub = [remain[row:row+D_] for row in range(0, D, D_)] # делаем нарезку получаем векторы w векторов разбитых на 11 подвекторов длинной 5
|
||||
for vector in index[2][r]:
|
||||
dist=0
|
||||
code=vector[1]
|
||||
for i in range(len(code)):
|
||||
dist+=IVFADC_DTW.dtw(x_sub[i],index[1][code[i]])
|
||||
v_dists.append([vector[0],dist])
|
||||
v_dists=sorted(v_dists, key=lambda x: x[1])
|
||||
v_dists=v_dists[:k]
|
||||
return v_dists
|
Loading…
Reference in New Issue
Block a user