Nous avons résumé la procédure pour effectuer l'analyse en composantes principales en utilisant sklearn de Nim. L'analyse des composants principaux peut être effectuée en quelques lignes en utilisant sklearn, qui n'a pas été mentionné, donc je vais essayer d'utiliser une bibliothèque appelée nimpy pour l'exécuter à partir de Nim. La partie qui effectue réellement l'analyse des composants principaux à l'aide de sklearn est écrite en Python.
J'ai déjà fait comment appeler Python avec nimpy, c'est donc une application. Appeler python de nim avec Nimpy
Comme dans l'exemple (reportez-vous à l'article ci-dessus) lors de l'insertion de Python arbitraire avec pyenv etc., ajoutez CONFIGURE_OPTS =" --enable-shared "
pour que libpython soit généré.
Ensuite, utilisez la poésie, etc. pour ajouter sklearn.
pyproject.toml
[tool.poetry]
name = "nimpy_pca"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]
[tool.poetry.dependencies]
python = "^3.7"
numpy = "^1.18"
scikit-learn = "^0.22.2"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry>=1.0"]
build-backend = "poetry.masonry.api"
Comme il est difficile d'appeler PCA depuis nim dans sklearn, écrivez le processus en python. (Dans nimpy, la méthode est appelée, vous ne pouvez donc pas utiliser le style comme initialiseur ou syntaxe sans valeur de retour.) J'essaye d'échanger des données et des résultats en utilisant JSON pour simplifier le passage des types.
pca.py
from sklearn.decomposition import PCA
import numpy as np
import json
def pca(json_text):
data = json.loads(json_text)
pca = PCA(n_components=2)
A = np.array(data)
pca.fit(A)
return {
"components": pca.components_.tolist(),
"varianceRatio": pca.explained_variance_ratio_.tolist()
}
Tout d'abord, spécifiez le chemin de libpython afin que le sklearn entré dans la poésie puisse être lu.
import nimpy
import nimpy/py_lib as pyLib
pyLib.pyInitLibPath("/root/.pyenv/versions/3.7.7/lib/libpython3.7m.so")
Ajoutez également le chemin où se trouve le fichier afin de pouvoir charger le Python que vous venez de créer.
discard pyImport("sys").path.append("/workspace/src")
Utilisez ensuite les données JSON et transmettez les données à la méthode précédente. J'utilise toJson
pour convertir la valeur de retour PyObject
en un type JsonNode.
let pcaResult = pyImport("pca.py").callMethod("pca", json).toJson
Le reste est complété en développant la valeur contenue dans pcaResult.
import sugar
let projectedValues = datas.map(data =>
pcaResult["components"].getElems.map(c => c.getElems.zip(data).map(n => n[0].getFloat * n[1]).foldl(a + b))
)
Je suis resté coincé dans la manière de spécifier le chemin de pyImport
et le conflit de nom du fichier python, mais j'ai pu lire python de cette façon.
Si vous appliquez cela, il semble que vous puissiez facilement exécuter d'autres traitements statistiques et traitements linéaires en le laissant à Python.