質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2592閲覧

結果をベクトルから行列に変換するときに数字の値が変わる理由がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/06/05 04:25

結果をベクトルから行列に変換するときに数字の値が変わる理由がわかりません。
http://www.yoheim.net/blog.php?q=20160313
のサイトを参考にレコメンドシステムを作っています。

import numpy as np from scipy.spatial.distance import cosine from scipy.spatial.distance import pdist from scipy.spatial.distance import squareform x = np.array([ [1,1,1,0,0,0], [1,1,0,0,0,0], [0,0,1,0,1,0], [0,0,1,1,1,0], [0,1,1,0,0,0], [1,1,0,1,1,0], [1,0,1,0,0,0], [0,0,0,0,0,1] ]) #列に変換 #print(x.T[0]) #print(x.T[1]) #コサイン類似度 item1 = x.T[0] item2 = x.T[1] sim = 1 - cosine(item1, item2) #全てのアイテムのコサイン類似度 # アイテムを行に、ユーザーを列に転置する x = x.T # 行ごと(=つまりアイテムごと)の距離を計算する d = pdist(x, 'cosine') print(d) # 「類似度 = 1 - 距離」 d = 1 - d #結果をベクトルから行列に変換 d = squareform(d) print(d)

とコードを書き実行すると

# 行ごと(=つまりアイテムごと)の距離を計算する d = pdist(x, 'cosine') print(d)

では

[ 0.25 0.5527864 0.64644661 0.71132487 1. 0.5527864 0.64644661 0.71132487 1. 0.68377223 0.48360222 1. 0.18350342 1. 1. ]

と出力され、

#結果をベクトルから行列に変換 d = squareform(d) print(d)

では

[[ 0. 0.75 0.4472136 0.35355339 0.28867513 0. ] [ 0.75 0. 0.4472136 0.35355339 0.28867513 0. ] [ 0.4472136 0.4472136 0. 0.31622777 0.51639778 0. ] [ 0.35355339 0.35355339 0.31622777 0. 0.81649658 0. ] [ 0.28867513 0.28867513 0.51639778 0.81649658 0. 0. ] [ 0. 0. 0. 0. 0. 0. ]]

と出力されました。
なぜ、結果をベクトルから行列に変換するときに数字の値が変わるのでしょうか?そして、行列に変換するときには数字の値も増えている理由もわかりません。なぜなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

簡単な例(4個の要素の一般的な距離)で説明します。

pdistで、4個のうち2間の距離が求まります。
4個のうち2個の組み合わせで、計6個の距離が求まります。
これは、4×4の表の右上三角部分が求まったことになります。

squareformで、右上三角部分から、距離行列が求まります。
これにより、対角線で対象な値が左下三角部分に入ることになります。

Python

1import numpy as np 2from scipy.spatial.distance import cosine 3from scipy.spatial.distance import pdist 4from scipy.spatial.distance import squareform 5 6# A~D:4個の要素 7x = np.array([[1],[5],[10],[20]]) # A, B, C, D 8print(x.shape) 9print(x) 10 11# 4個のうち2個の距離を求める 12# 3+2+1=6通り 13d = pdist(x) 14print(d.shape) 15print(d) 16 17# 以下のように、右上三角部分が求まる 18# A B C D 19# A 0 4 9 19 20# B 0 0 5 15 21# C 0 0 0 10 22# D 0 0 0 0 23 24# 距離行列=対角線対象な行列ができる 25d = squareform(d) 26print(d.shape) 27print(d) 28 29# A B C D 30# A 0 4 9 19 31# B 4 0 5 15 32# C 9 5 0 10 33# D 19 15 10 0

結果

(4, 1) [[ 1] [ 5] [10] [20]] (6,) [ 4. 9. 19. 5. 15. 10.] (4, 4) [[ 0. 4. 9. 19.] [ 4. 0. 5. 15.] [ 9. 5. 0. 10.] [ 19. 15. 10. 0.]]

提示した例では、d = 1 - dの結果もprint(d)してみると理解しやすいかと思います。

投稿2017/06/05 07:53

編集2017/06/05 07:56
can110

総合スコア38258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問