Wir haben das Verfahren zur Durchführung der Hauptkomponentenanalyse mit sklearn von Nim zusammengefasst. Die Hauptkomponentenanalyse kann in wenigen Zeilen mit sklearn durchgeführt werden, was nicht erwähnt wurde. Daher werde ich versuchen, eine Bibliothek namens nimpy zu verwenden, um sie von Nim aus auszuführen. Der Teil, der tatsächlich die Hauptkomponentenanalyse mit sklearn durchführt, ist in Python geschrieben.
Ich habe schon früher Python mit nimpy aufgerufen, es ist also eine Anwendung. Rufen Sie Python von Nim mit Nimpy auf
Fügen Sie wie im Beispiel (siehe obigen Artikel) "CONFIGURE_OPTS =" --enable-shared "" hinzu, wenn Sie beliebiges Python mit pyenv usw. einfügen, damit libpython generiert wird. Verwenden Sie dann Gedichte usw., um sklearn hinzuzufügen.
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"
Da es schwierig ist, PCA von nim in sklearn aufzurufen, schreiben Sie den Prozess in Python. (In nimpy wird die Methode aufgerufen, sodass Sie den Stil wie Initialisierer oder Syntax nicht ohne Rückgabewert verwenden können.) Ich versuche, Daten und Ergebnisse mit JSON auszutauschen, um die Übergabe von Typen zu vereinfachen.
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()
}
Geben Sie zunächst den libpython-Pfad an, damit das in Poesie eingegebene sklearn gelesen werden kann.
import nimpy
import nimpy/py_lib as pyLib
pyLib.pyInitLibPath("/root/.pyenv/versions/3.7.7/lib/libpython3.7m.so")
Fügen Sie außerdem den Pfad hinzu, in dem sich die Datei befindet, damit Sie den gerade erstellten Python laden können.
discard pyImport("sys").path.append("/workspace/src")
Verwenden Sie dann die JSON-Daten und übergeben Sie die Daten an die vorherige Methode. Ich verwende toJson
, um den Rückgabewert PyObject
in einen JsonNode-Typ zu konvertieren.
let pcaResult = pyImport("pca.py").callMethod("pca", json).toJson
Der Rest wird durch Erweitern des in pcaResult enthaltenen Werts abgeschlossen.
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))
)
Ich war festgefahren, um den Pfad von "pyImport" und den Namenskonflikt der Python-Datei anzugeben, aber ich konnte Python auf diese Weise lesen. Wenn Sie dies anwenden, können andere statistische und lineare Verarbeitungen leicht ausgeführt werden, indem Sie sie Python überlassen.
Recommended Posts