Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

About encode method of FixedPointEncoder for numpy array #484

Open
matsutakk opened this issue Jul 28, 2023 · 1 comment
Open

About encode method of FixedPointEncoder for numpy array #484

matsutakk opened this issue Jul 28, 2023 · 1 comment

Comments

@matsutakk
Copy link

Hi, thank you for the great MPC framework.

I think we need parentheses here.

return self._scale * torch.from_numpy(x).long().to(device)

should be

 return (self._scale * torch.from_numpy(x)).long().to(device)

Thank you.

@matsutakk
Copy link
Author

matsutakk commented Jul 28, 2023

I noticed that when executing below code, decreasing accuracy.

from sklearn.datasets import load_iris,load_breast_cancer,load_digits
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import accuracy_score
import numpy as np

import crypten,torch

crypten.init()

def encrypted_knn_search(cipher_databases, cipher_query):
    distances = (cipher_databases - cipher_query).pow(2).sum(dim=1).sqrt()
    nearest_index = distances.argmin().get_plain_text()
    return nearest_index

data = load_iris()
X = data.data
y = data.target

k = 1
knn = KNeighborsClassifier(n_neighbors=k)
stratified_k_fold = StratifiedKFold(n_splits=5)
accuracies_plain = []
accuracies_mpc = []

for train_index, test_index in stratified_k_fold.split(X, y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # Plain
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    accuracies_plain.append(accuracy)
    
    # Crypten
    cipher_databases = crypten.cryptensor(X_train)    
    y_pred = []
    for i in X_test:
        cipher_query = crypten.cryptensor(i)
        pred = encrypted_knn_search(cipher_databases,cipher_query)
        idx = (pred == 1).nonzero().squeeze().item()
        y_pred.append(y_train[idx])
    accuracy = accuracy_score(y_test, y_pred)
    accuracies_mpc.append(accuracy)

mean_accuracy_plain = np.mean(accuracies_plain)
print('Accuracy for each fold: ', accuracies_plain)
print('Mean accuracy Plain: ', mean_accuracy_plain)
mean_accuracy_mpc = np.mean(accuracies_mpc)
print('Accuracy for each fold: ', accuracies_mpc)
print('Mean accuracy MPC: ', mean_accuracy_mpc)

If i convert numpy array to tensor before passing cryptetensor(), accuracy improved.

from sklearn.datasets import load_iris,load_breast_cancer,load_digits
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import accuracy_score
import numpy as np

import crypten,torch

crypten.init()

def encrypted_knn_search(cipher_databases, cipher_query):
    distances = (cipher_databases - cipher_query).pow(2).sum(dim=1).sqrt()
    nearest_index = distances.argmin().get_plain_text()
    return nearest_index

data = load_iris()
X = data.data
y = data.target

k = 1
knn = KNeighborsClassifier(n_neighbors=k)
stratified_k_fold = StratifiedKFold(n_splits=5)
accuracies_plain = []
accuracies_mpc = []

for train_index, test_index in stratified_k_fold.split(X, y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # Plain
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    accuracies_plain.append(accuracy)
    
    # Crypten
    cipher_databases = crypten.cryptensor(torch.tensor(X_train))    
    y_pred = []
    for i in X_test:
        cipher_query = crypten.cryptensor(torch.tensor(i))
        pred = encrypted_knn_search(cipher_databases,cipher_query)
        idx = (pred == 1).nonzero().squeeze().item()
        y_pred.append(y_train[idx])
    accuracy = accuracy_score(y_test, y_pred)
    accuracies_mpc.append(accuracy)

mean_accuracy_plain = np.mean(accuracies_plain)
print('Accuracy for each fold: ', accuracies_plain)
print('Mean accuracy Plain: ', mean_accuracy_plain)
mean_accuracy_mpc = np.mean(accuracies_mpc)
print('Accuracy for each fold: ', accuracies_mpc)
print('Mean accuracy MPC: ', mean_accuracy_mpc)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant