macOSのPowerShellに、PackageManagementでMathNet.Numericsを入れてみた
Follow @venividivici830
PowerShellでも、yumやapt-getのようなパッケージ管理システムがあることを知ったので、.NETの数値計算ライブラリーである、MathNet.Numericsを、試しにインストールしてみた。
環境はmacOS 10.13.5、PowerShell v6.0.2。
このサイトや、Microsoftの公式ドキュメントを参考にやってみた。
MathNet.Numericsは、リポジトリーであるNuGetに登録されている。
Get-PackageProviderコマンドレットで確認したところ、NuGetはPackage Providerとして登録されている。
Get-PackageSourceコマンドレットで確認したところ、PackageSourceにNuGetがない。
そこで、ここに記載のhttps://api.nuget.org/v3/index.jsonを、Register-PackageSourceコマンドレットでPackageSourceとして登録し、再度Find-Packageで検索したが、ダメだった。
どうやらNuGet APIのバージョンがv2でないと駄目なようだ。
一度、上で登録したPackageSource を、Unregister-PackageSourceで削除してから、v2のURLである、https://www.nuget.org/api/v2/を登録した。
Set-PackageSourceコマンドレットで変更しても、なぜかダメだった。
これで、無事、Find-Packageコマンドレットで、MathNet.Numericsがヒットするようになった。
Register-PackageSourceコマンドレットで登録しなくても、Find-PackageやInstall-Packageの-Sourceオプションで、PackageSourceを指定できる。
このため、Unregister-PackageSourceで削除した。
下記のように、-Sourceオプションで指定すれば、Registerされていなくても、ヒットする。
なお、当然だが、https://api.nuget.org/v3/index.jsonは、-Sourceオプションに指定してもダメだった。
コンソールに何も出ずに、数分待ったw
Unable to find typeと出た。
Install-Packageでインストールされたパッケージのデフォルトの格納場所は、/usr/local/share/PackageManagement/NuGet/Packages以下になるようだ。
findでdllを検索してみた。
MathNet.Numericsのdllはいくつか見つかったが、とりあえず新しそうな、net461を読み込んだ。
再度、MathNet.Numerics.Statisticsネームスペースの、Statisticsを使用できるか確認した。
これで、使用できそうだ。
[MathNet.Numerics.Statistics.Statistics]は長すぎるので、
上記のように、using namespaceを宣言すれば、[Statistics]::static methodのように使用できる。
下記のように、[MathNet.Numerics.Statistics.Statistics]を変数に格納しても、短縮できる。
これで、PowerShellでいろいろ統計計算できそうだ。
まあ、PowerShellでやる必要はなく、Rとか使えばいいし、そもそも統計を使いこなせてないけど。。
PowerShellでも、yumやapt-getのようなパッケージ管理システムがあることを知ったので、.NETの数値計算ライブラリーである、MathNet.Numericsを、試しにインストールしてみた。
環境はmacOS 10.13.5、PowerShell v6.0.2。
このサイトや、Microsoftの公式ドキュメントを参考にやってみた。
MathNet.Numericsがヒットしない
まず、yum searchに該当するFind-Packageコマンドレットで、MathNet.Numericsを検索してみたが、見つからない。> Find-Package -Name MathNet.Numerics Find-Package : No match was found for the specified search criteria and package name 'MathNet.Numerics'. Try Get-PackageSource to see all available registered package sources. At line:1 char:1 + Find-Package -Name MathNet.Numerics + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Microsoft.Power...ets.FindPackage:FindPackage) [Find-Package], Exception + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.FindPackage
MathNet.Numericsは、リポジトリーであるNuGetに登録されている。
Get-PackageProviderコマンドレットで確認したところ、NuGetはPackage Providerとして登録されている。
> Get-PackageProvider Name Version DynamicOptions ---- ------- -------------- NuGet 2.8.5.210 Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag, Contains, AllowPrereleaseVersions, Con... PowerShellGet 1.6.0.0 PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, InstallUpdate, NoPathUpdate, AllowPrerel...
Get-PackageSourceコマンドレットで確認したところ、PackageSourceにNuGetがない。
> Get-PackageSource Name ProviderName IsTrusted Location ---- ------------ --------- -------- PSGallery PowerShellGet False https://www.msn.com/ja-jp/?ocid=NEFLS000
そこで、ここに記載のhttps://api.nuget.org/v3/index.jsonを、Register-PackageSourceコマンドレットでPackageSourceとして登録し、再度Find-Packageで検索したが、ダメだった。
> Register-PackageSource -Name "NuGet" -Location "https://api.nuget.org/v3/index.json" -ProviderName "NuGet" Name ProviderName IsTrusted Location ---- ------------ --------- -------- NuGet NuGet False https://api.nuget.org/v3/index.json > Find-Package -Name MathNet.Numerics Find-Package : No match was found for the specified search criteria and package name 'MathNet.Numerics'. Try Get-PackageSource to see all available registered package sources. At line:1 char:1 + Find-Package -Name MathNet.Numerics + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound:(Microsoft.Power...ets.FindPackage:FindPackage) [Find-Package], Exception + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.FindPackage
MathNet.Numericsをヒットさせるまで
ここに解決方法が書いてあった。どうやらNuGet APIのバージョンがv2でないと駄目なようだ。
一度、上で登録したPackageSource を、Unregister-PackageSourceで削除してから、v2のURLである、https://www.nuget.org/api/v2/を登録した。
Set-PackageSourceコマンドレットで変更しても、なぜかダメだった。
> Unregister-PackageSource -Name NuGet > Register-PackageSource -Name "NuGet" -Location "https://www.nuget.org/api/v2/" -ProviderName "NuGet"
これで、無事、Find-Packageコマンドレットで、MathNet.Numericsがヒットするようになった。
> Find-Package -Name MathNet.Numerics Name Version Source Summary ---- ------- ------ ------- MathNet.Numerics 4.5.1 NuGet Math.NET Numerics is the numerical foundation of the Math.NET project, aiming to provide me...
このため、Unregister-PackageSourceで削除した。
> Unregister-PackageSource -Name NuGet
下記のように、-Sourceオプションで指定すれば、Registerされていなくても、ヒットする。
> Find-Package -Name MathNet.Numerics -Source https://www.nuget.org/api/v2/ Name Version Source Summary ---- ------- ------ ------- MathNet.Numerics 4.5.1 https://www.nuget.org/api/v2/ Math.NET Numerics is the numerical foundation of the Math.NET project, aimi...
なお、当然だが、https://api.nuget.org/v3/index.jsonは、-Sourceオプションに指定してもダメだった。
インストール〜dll読み込み
Install-Packageコマンドレットに、https://www.nuget.org/api/v2/をPackageSourceとして指定し、MathNet.Numericsをインストール。
本当にインストールするか聞かれるので、Yと入力し、Enter。
本当にインストールするか聞かれるので、Yと入力し、Enter。
> Install-Package -Name MathNet.Numerics -Source https://www.nuget.org/api/v2/ The package(s) come(s) from a package source that is not marked as trusted. Are you sure you want to install software from 'https://www.nuget.org/api/v2/'? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): Y Name Version Source Summary ---- ------- ------ ------- 〜依存パッケージのインストール〜 MathNet.Numerics 4.5.1 https://www.nuget.org/api/v2/ Math.NET Numerics is the numerical foundation of the Math.NET project, aimi...
コンソールに何も出ずに、数分待ったw
初めてInstall-Packageしたから、インストールされていない依存パッケージが多かったからか?
インストールされたので、実際に使用する。
MathNet.Numerics.Statisticsネームスペースの、Statisticsを使用できるか確認したが、
MathNet.Numerics.Statisticsネームスペースの、Statisticsを使用できるか確認したが、
> [MathNet.Numerics.Statistics.Statistics] Unable to find type [MathNet.Numerics.Statistics.Statistics]. At line:1 char:1 + [MathNet.Numerics.Statistics.Statistics] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (MathNet.Numerics.Statistics.Statistics:TypeName) [], RuntimeException + FullyQualifiedErrorId : TypeNotFound
Unable to find typeと出た。
dllファイルを読み込む必要があるようだ。
dllの場所がわからないので、まずはGet-Packageコマンドレットで、MathNet.Numericsパッケージを検索した。
dllの場所がわからないので、まずはGet-Packageコマンドレットで、MathNet.Numericsパッケージを検索した。
> (Get-Package | Where-Object {$_.Name -eq "MathNet.Numerics"}).Source /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/MathNet.Numerics.4.5.1.nupkg
Install-Packageでインストールされたパッケージのデフォルトの格納場所は、/usr/local/share/PackageManagement/NuGet/Packages以下になるようだ。
findでdllを検索してみた。
$ find /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1 | grep dll /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/net40/MathNet.Numerics.dll /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/net461/MathNet.Numerics.dll /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/netstandard1.3/MathNet.Numerics.dll /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/netstandard2.0/MathNet.Numerics.dll
MathNet.Numericsのdllはいくつか見つかったが、とりあえず新しそうな、net461を読み込んだ。
> Add-Type -Path /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/net461/MathNet.Numerics.dll
再度、MathNet.Numerics.Statisticsネームスペースの、Statisticsを使用できるか確認した。
> [MathNet.Numerics.Statistics.Statistics] IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False Statistics System.Object
これで、使用できそうだ。
MathNet.Numerics.Statisticsネームスペースの、Statisticsを使ってみた
試しに、StandardDeviationメソッドで、標準偏差を計算してみた。
メソッドの入力として、Double[]型の配列、$arrayを、適当に用意した。
メソッドの入力として、Double[]型の配列、$arrayを、適当に用意した。
> [Double[]] $array = @(1.0, 2.0, 3.0) > [MathNet.Numerics.Statistics.Statistics]::StandardDeviation($array) 1
[MathNet.Numerics.Statistics.Statistics]は長すぎるので、
> using namespace MathNet.Numerics.Statistics
上記のように、using namespaceを宣言すれば、[Statistics]::static methodのように使用できる。
下記、平均、中央値、標本分散、母分散の例。
平均
> [Statistics]::Mean($array)
中央値
> [Statistics]::Median($array)
標本分散
> [Statistics]::Variance($array)
母分散
> [Statistics]::PopulationVariance($array)
下記のように、[MathNet.Numerics.Statistics.Statistics]を変数に格納しても、短縮できる。
> $stat = [MathNet.Numerics.Statistics.Statistics] > $stat::Mean($array)
これで、PowerShellでいろいろ統計計算できそうだ。
まあ、PowerShellでやる必要はなく、Rとか使えばいいし、そもそも統計を使いこなせてないけど。。
コメント
コメントを投稿