私は、任意の 2 人のユーザー間の類似性を計算する必要があるコミュニティ Web サイトを作成しています。各ユーザーは、次の属性で記述されます。
年齢、肌質(オイリー、ドライ)、髪質(ロング、ショート、ミディアム)、ライフスタイル(アウトドア好き、テレビジャンキー)など。
この問題に対処する方法を誰か教えてもらえますか、またはいくつかのリソースを教えてもらえますか?
私は、任意の 2 人のユーザー間の類似性を計算する必要があるコミュニティ Web サイトを作成しています。各ユーザーは、次の属性で記述されます。
年齢、肌質(オイリー、ドライ)、髪質(ロング、ショート、ミディアム)、ライフスタイル(アウトドア好き、テレビジャンキー)など。
この問題に対処する方法を誰か教えてもらえますか、またはいくつかのリソースを教えてもらえますか?
データセット内の観測間のすべてのペアワイズ非類似度 (距離) を ( Rで)計算する別の方法。元の変数は混合タイプである場合があります。名義、序数、および (a) 対称のバイナリ データの処理は、Gower の一般的な非類似度係数を使用して実現されます (Gower, JC (1971) A general factor of similarity and some of its properties, Biometrics 27, 857–874)。詳細については、47 ページを参照してください。x にこれらのデータ型の列が含まれている場合、Gower の係数がメトリックとして使用されます。
例えば
x1 <- factor(c(10, 12, 25, 14, 29))
x2 <- factor(c("oily", "dry", "dry", "dry", "oily"))
x3 <- factor(c("medium", "short", "medium", "medium", "long"))
x4 <- factor(c("active outdoor lover", "TV junky", "TV junky", "active outdoor lover", "TV junky"))
x <- cbind(x1,x2,x3,x4)
library(cluster)
daisy(x, metric = "euclidean")
あなたが得るでしょう:
Dissimilarities :
1 2 3 4
2 2.000000
3 3.316625 2.236068
4 2.236068 1.732051 1.414214
5 4.242641 3.741657 1.732051 2.645751
カテゴリ データの次元削減の方法 (変数を均一なクラスターに配置する方法) に興味がある場合は、これを確認してください。
各属性に適切な重みを付け、値の差を追加します。
enum SkinType
Dry, Medium, Oily
enum HairLength
Bald, Short, Medium, Long
UserDifference(user1, user2)
total := 0
total += abs(user1.Age - user2.Age) * 0.1
total += abs((int)user1.Skin - (int)user2.Skin) * 0.5
total += abs((int)user1.Hair - (int)user2.Hair) * 0.8
# etc...
return total
違いではなく類似性が本当に必要な場合は、使用してください1 / UserDifference(a, b)
あなたはおそらく見てみる必要があります
これらのトピックにより、プログラムはユーザー コレクション内の類似点とクラスターを認識し、それらに適応しようとすることができます...
その後、関連するユーザーのさまざまな隠れた共通グループを知ることができます...(つまり、緑の髪のユーザーは通常、テレビを見るのが好きではありません..)
アドバイスとして、この機能を自分で実装するのではなく、すぐに実装されたツールを使用するようにしてください... Open Directory Data Mining Projects
を参照してください。
あなたの場合にうまくいくかもしれない2つのデータポイント間の違いのための単純な主観的メトリックを達成するための3つのステップ:
次に、2 人の人の差を計算できます (Person.age、.skin、.hair などは既にステップ 1 を通過しており、数値であると仮定します):
double Difference(Person p1, Person p2) {
double agescale=0.1;
double skinscale=0.5;
double hairscale=1;
double lifestylescale=1;
double agediff = (p1.age-p2.age)*agescale;
double skindiff = (p1.skin-p2.skin)*skinscale;
double hairdiff = (p1.hair-p2.hair)*hairscale;
double lifestylediff = (p1.lifestyle-p2.lifestyle)*lifestylescale;
double diff = sqrt(agediff^2 + skindiff^2 + hairdiff^2 + lifestylediff^2);
return diff;
}
この例の diff は (0..1) のような適切なスケールではないことに注意してください。値の範囲は、0 (差なし) から大きな値 (差が大きい) までです。また、この方法はほとんど完全に非科学的であり、実用的な差の測定基準をすばやく提供するように設計されています.
ストリング差を計算するためのアルゴリズムを見てください。必要なものと非常によく似ています。属性をビット文字列として保存し、文字列間の距離を計算します