bugfix> r > 投稿

私の問題を理解するには、データセット全体が必要です: https://pastebin.com/82paf0G8

前処理: 注文のリストと696の一意のアイテム番号があり、アイテムの各ペアが一緒に注文される頻度に基づいて、それらをクラスター化したいと考えました。アイテムの各ペア、同じ注文内での出現頻度の数について計算しました。つまり、2つのアイテム間で発生した最高数は489でした​​。次に、頻度/「すべてのペアの最大頻度」(489)によって、類似性/相関を「計算」しました。これで、アップロードしたデータセットができました。

類似性/相関関係: この場合、類似性のアプローチが最適かどうかはわかりません。 「Jaccardの係数/インデックス」と呼ばれるものでも試しましたが、ほぼ同じ結果が得られました。

データセット: データセットには、材料番号V1およびV2が含まれています。およびNは、0〜1の2つの材料番号間の相関です。

別のものからの助けを借りて、私は距離行列を作成し、PAMクラスタリングを使用することに成功しました。

なぜPAMクラスタリングなのか? データサイエンティストはこれを提案します:あなたは情報のないペアの95%以上を持っています、これはこれらすべての材料が同じ距離にあり、単一のクラスターが非常に分散しているようにします。この問題はPAMアルゴリズムを使用して解決できますが、それでも非常に集中したグループになります。別の解決策は、1以外の距離の重みを増やすことです。

問題1: マトリックスは567x567のみです。クラスタリングには、多くはゼロですが、696x696のフルマトリックスが必要だと思います。確信はないけど。

問題2: クラスタリングはあまりうまくいきません。クラスターが非常に集中します。最初のクラスターには多くのアイテムがクラスター化されています。また、PAMクラスターの検証方法によると、クラスタリング結果は貧弱です。それは類似性分析によるものですか?他に何を使うべきですか?データの95%がゼロであるためですか?ゼロを別のものに変更する必要がありますか?

コード全体と結果:

#Suppose X is the dataset
df <- data.table(X)
ss <- dcast(rbind(df, df[, .(V1 = V2, V2 = V1, N)]), V1~V2, value.var = "N")[, -1]
ss <- ss/max(ss, na.rm = TRUE)
ss[is.na(ss)] <- 0
diag(ss) <- 1

PAMクラスタリングを使用するようになりました

dd2 <- as.dist(1 - sqrt(ss))
pam2 <- pam(dd2, 4)
summary(as.factor(pam2$clustering))

しかし、次のように、非常に集中したクラスターが得られます。

1   2   3   4 
382 100  23  62

回答 2 件
  • どこから696番号を取得するかわかりません。 rbindした後、V1とV2に567の一意の値を持つデータフレームがあり、dcastを実行し、期待どおりのマトリックスで終わる567 x567。クラスタリングに関しては、クラスターに問題はありません。

    dim(df) # [1] 7659    3
    test <- rbind(df, df[, .(V1 = V2, V2 = V1, N)])
    dim(test) # [1] 15318     3
    length(unique(test$V1)) # 567
    length(unique(test$V2)) # 567
    test2 <- dcast(test, V1~V2, value.var = "N")[,-1]
    dim(test2) # [1] 567 567
    
    

  • @Mayo、データ科学者が PAM について言ったことを忘れてください 。あなたが言及したので、この仕事は論文のためです。学術的な観点からすると、PAMが必要な理由に対する現在の正当化にはメリットがありません。基本的に、PAMがケーススタディに必要な理由を証明または正当化する必要があります。そして、データセットの(連続)変数の性質を考えると、 V1, V2, N 、ここでPAMが適用される理由に関するロジックは表示されません(コメントで述べたように、PAMは混合変数に最適です)。 さらに続けて、Rでの相関検出に関するこの投稿を参照してください。

    # Objective: Detect Highly Correlated variables, visualize them and remove them
    data("mtcars")
    my_data <- mtcars[, c(1,3,4,5,6,7)]
    # print the first 6 rows
    head(my_data, 6)
    # compute correlation matrix using the cor()
    res<- cor(my_data)
    round(res, 2) # Unfortunately, the function cor() returns only the correlation coefficients between variables. 
    # Visualize the correlation
    # install.packages("corrplot")
    library(corrplot)
    corrplot(res, type = "upper", order = "hclust", 
             tl.col = "black", tl.srt = 45)
    # Positive correlations are displayed in blue and negative correlations in red color. Color intensity and the size of the circle are proportional to the correlation coefficients. In the right side of the correlogram, the legend color shows the correlation coefficients and the corresponding colors.
    # tl.col (for text label color) and tl.srt (for text label string rotation) are used to change text colors and rotations.
    #Apply correlation filter at 0.80,
    #install.packages("caret", dependencies = TRUE)
    library(caret)
    highlyCor <- colnames(my_data)[findCorrelation(res, cutoff = 0.80, verbose = TRUE)]
    # show highly correlated variables
    highlyCor
    [1] "disp" "mpg"
    
    
    removeHighCor<- findCorrelation(res, cutoff = 0.80) # returns indices of highly correlated variables
    # remove highly correlated variables from the dataset
    my_data<- my_data[,-removeHighCor]
    [1] 32  4
    
    

    お役に立てれば。

あなたの答え