gpt4 book ai didi

function - 高尔距离函数的实现

转载 作者:行者123 更新时间:2023-12-01 02:52:46 25 4
gpt4 key购买 nike

我有一个带数字的矩阵(大小:28 列和 47 行)。该矩阵有一个额外的行,其中包含列的标题(“序数”和“名义”)。

我想在这个矩阵上使用高尔距离函数。 Here说:

第 i 个和第 j 个单元之间的最终不相似性作为每个变量的不相似性的加权和获得:

    d(i,j) = sum_k(delta_ijk * d_ijk ) / sum_k( delta_ijk )

特别是,d_ijk 表示考虑第 k 个变量计算的第 i 个和第 j 个单元之间的距离。这取决于变量的性质:
  • 因子或字符列是
    被视为绝对名义
    变量和 d_ijk = 0如果

    x_ik =x_jk,否则为 1;
  • 有序列被视为
    分类序数变量和
    这些值被替换为
    对应位置索引,r_ik in
    因子水平。这些位置
    索引(不同于
    R函数等级的输出)是
    按以下方式转换

  • z_ik = (r_ik - 1)/(max(r_ik) - 1)

    这些新值 z_ik 被视为对
    区间标度变量。

    就权重 delta_ijk 而言:
  • delta_ijk = 0 如果 x_ik = NA 或 x_jk =
    不适用;
  • 在所有其他情况下,delta_ijk = 1。

  • 我知道有一个 gower.dist 函数,但我必须这样做。
    因此,对于“d_ijk”、“delta_ijk”和“z_ik”,我尝试创建函数,因为我没有找到更好的方法。

    我从“delta_ijk”开始,我试过这个:
    Delta=function(i,j){for (i in 1:28){for (j in 1:47){  
    +{if (MyHeader[i,j]=="nominal")
    + result=0
    +{else if (MyHeader[i,j]=="ordinal") result=1}}}}
    +;result}

    但我得到了错误。所以我被卡住了,其余的我都做不了。

    附言如果我犯错了请见谅,但英语不是我经常使用的语言。

    最佳答案

    你为什么要重新发明轮子billyt? R 中有几个函数/包可以为您计算,包括 daisy()在 R 附带的包集群中。

    不过,首先要从数据中取出那些“数据类型” header 。如果这确实是一个矩阵,那么此标题行中的字符信息将使整个矩阵成为一个字符矩阵。如果是数据框,则所有列都可能是因子。您想要做的是将每列(数据框的组成部分)中的数据类型编码为 'factor''ordered' .

    df <- data.frame(A = c("ordinal",1:3), B = c("nominal","A","B","A"),
    C = c("nominal",1,2,1))

    这给出了这一点——请注意,由于额外的信息,所有这些都被存储为因素。
    > head(df)
    A B C
    1 ordinal nominal nominal
    2 1 A 1
    3 2 B 2
    4 3 A 1
    > str(df)
    'data.frame': 4 obs. of 3 variables:
    $ A: Factor w/ 4 levels "1","2","3","ordinal": 4 1 2 3
    $ B: Factor w/ 3 levels "A","B","nominal": 3 1 2 1
    $ C: Factor w/ 3 levels "1","2","nominal": 3 1 2 1

    如果我们去掉第一行并重新编码为正确的类型,我们就可以很容易地计算出高尔系数。
    > headers <- df[1,]
    > df <- df[-1,]
    > DF <- transform(df, A = ordered(A), B = factor(B), C = factor(C))
    > ## We've previously shown you how to do this (above line) for lots of columns!
    > str(DF)
    'data.frame': 3 obs. of 3 variables:
    $ A: Ord.factor w/ 3 levels "1"<"2"<"3": 1 2 3
    $ B: Factor w/ 2 levels "A","B": 1 2 1
    $ C: Factor w/ 2 levels "1","2": 1 2 1
    > require(cluster)
    > daisy(DF)
    Dissimilarities :
    2 3
    3 0.8333333
    4 0.3333333 0.8333333

    Metric : mixed ; Types = O, N, N
    Number of objects : 3

    这与 gower.dist() 相同对于此数据(尽管格式略有不同( as.matrix(daisy(DF)) )是等效的):
    > gower.dist(DF)
    [,1] [,2] [,3]
    [1,] 0.0000000 0.8333333 0.3333333
    [2,] 0.8333333 0.0000000 0.8333333
    [3,] 0.3333333 0.8333333 0.0000000

    你说你不能这样做?你能解释一下为什么不吗?因为您似乎要付出一定程度的努力来做其他人已经为您编写的代码。这不是家庭作业吧?

    关于function - 高尔距离函数的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4298870/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com