17

私は、任意の 2 人のユーザー間の類似性を計算する必要があるコミュニティ Web サイトを作成しています。各ユーザーは、次の属性で記述されます。

年齢、肌質(オイリー、ドライ)、髪質(ロング、ショート、ミディアム)、ライフスタイル(アウトドア好き、テレビジャンキー)など。

この問題に対処する方法を誰か教えてもらえますか、またはいくつかのリソースを教えてもらえますか?

4

6 に答える 6

15

データセット内の観測間のすべてのペアワイズ非類似度 (距離) を ( 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

カテゴリ データの次元削減の方法 (変数を均一なクラスターに配置する方法) に興味がある場合は、これを確認してください。

于 2010-06-06T09:52:02.363 に答える
3

各属性に適切な重みを付け、値の差を追加します。

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)

于 2010-06-05T19:35:59.667 に答える
2

あなたはおそらく見てみる必要があります

これらのトピックにより、プログラムはユーザー コレクション内の類似点とクラスターを認識し、それらに適応しようとすることができます...

その後、関連するユーザーのさまざまな隠れた共通グループを知ることができます...(つまり、緑の髪のユーザーは通常、テレビを見るのが好きではありません..)

アドバイスとして、この機能を自分で実装するのではなく、すぐに実装されたツールを使用するようにしてください... Open Directory Data Mining Projects
を参照してください。

于 2010-06-05T19:32:37.440 に答える
1

あなたの場合にうまくいくかもしれない2つのデータポイント間の違いのための単純な主観的メトリックを達成するための3つのステップ:

  1. すべての変数を代表的な数値変数に取り込みます。たとえば、肌のタイプ (オイリー = -1、乾燥 = 1)、髪のタイプ (ロング = 2、ショート = 0、ミディアム = 1)、ライフスタイル (アクティブなアウトドア愛好家 = 1、テレビジャンキー=-1)、年齢は数字です。
  2. 違いを示すために指定した相対的な重要度に合うように、すべての数値範囲をスケーリングします。例: 10 歳の年齢差は、ロングヘアとミディアムヘアの差、脂性肌と乾燥肌の差とほぼ同じです。したがって、年齢スケールの 10 は、髪スケールの 1 と肌スケールの 2 と同じように異なるため、年齢の差を 0.1 でスケールし、髪のスケールを 1 で、皮膚のスケールを 0.5 でスケールします。
  3. 適切な距離メトリックを使用して、さまざまなスケールでの 2 人の違いを 1 つの全体的な違いにまとめます。この数値が小さいほど、類似性が高くなります。距離関数の最初の試みとして、単純な二次差分をお勧めします。

次に、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 (差なし) から大きな値 (差が大きい) までです。また、この方法はほとんど完全に非科学的であり、実用的な差の測定基準をすばやく提供するように設計されています.

于 2010-06-10T10:12:02.457 に答える
0

これらの2つのトピックを読む必要があります。

最も一般的なクラスタリングアルゴリズムk-は

そして、類似性マトリックスはクラスタリングに不可欠です

于 2010-06-28T11:37:24.010 に答える
0

ストリング差を計算するためのアルゴリズムを見てください。必要なものと非常によく似ています。属性をビット文字列として保存し、文字列間の距離を計算します

于 2010-06-05T19:54:10.387 に答える