Добрый день,
Я разработал эту функцию R, которая хэширует данные в сегментах:
# The used packages
library("pacman")
pacman::p_load(dplyr, tidyr, devtools, MASS, pracma, mvtnorm, interval, intervals)
pacman::p_load(sprof, RDocumentation, helpRFunctions, foreach , philentropy , Rcpp , RcppAlgos)
hash<-function(v,p){
if(dot(v,p)>0) return(1) else (0) }
LSH_Band<-function(data,K ){
# We retrieve numerical columns of data
t<-list.df.var.types(data)
df.r<-as.matrix(data[c(t$numeric,t$Intervals)])
n=nrow(df.r)
# we create K*K matrice using normal law
rn=array(rnorm(K*K,0,1),c(K,K))
# we create K*K matrice of integers using uniform law , integrs are unique in each column
rd=unique.array(array(unique(ceiling(runif(K*K,0,ncol(df.r)))),c(K,K)))
buckets<-array(NA,c(K,n))
for (i in 1:K) {
for (j in 1:n) {
buckets[i,j]<-hash(df.r[j,][rd[,i]],rn[,i])
}
}
return(buckets)
}
> df.r
age height salaire.1 salaire.2
1 27 180 0 5000
2 26 178 0 5000
3 30 190 7000 10000
4 31 185 7000 10000
5 31 187 7000 10000
6 38 160 10000 15000
7 39 158 10000 15000
> LSH_Band(df.r, 3 )
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1 1 1 1 1 1 1
[2,] 1 1 0 0 0 0 0
[3,] 0 0 0 0 0 0 0
Функция точек - скалярное произведение двух векторов.
- Моя функция L sh берет строку моих данных, затем часть полученной строки, используя
df.r[j,][rd[,i]]
. df.r[j,]
- это строка данных в j-стиле. rd[,i]
: rd - это K * K-матрица целых чисел от 1 до ncol (df.r), каждый столбец матрицы содержит только уникальные целые числа.
rn[,i]
: rn - матрица K * K, содержащая значения закона N (0,1).
В результирующем Таблица наблюдений представлена в столбцах. У меня будет k рядов. Для последней строки я вычислю скалярное произведение между df.r[j,][rd[,K]]
и rn[,K]
. Я получу 1, если скалярное произведение положительно. rd[,K]
и rn[,K]
будут использоваться только для последней строки в итоговой таблице и для всех наблюдений в этой строке.
Мой вопрос:
Заменить ли циклы переменными i и j на a lapply function ?
Мои реальные данные будут большими, поэтому я задаю этот вопрос.
Спасибо!