【问题标题】:calculate Euclidean Distance for three means计算三种均值的欧几里得距离
【发布时间】:2020-02-21 22:27:45
【问题描述】:

我在计算欧几里得距离时遇到问题。

稍后我参考该函数,它给了我这个错误:

TypeError: 输入类型不支持 ufunc 'bitwise_and',并且根据强制转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型

硬编码的 K-means 算法需要它。

def euclideanDist(df,pointIDX,mean_1,mean_2,mean_3):

    point = df.iloc[pointIDX][['Shoe_Size','Height']].values
    mean_1 = mean_1[['Shoe_Size','Height']].values
    mean_2 = mean_2[['Shoe_Size','Height']].values
    mean_3 = mean_3[['Shoe_Size','Height']].values

    dist_Total_1 = sum([a-b for a,b in zip(point,mean_1)])**2
    dist_Total_2 = sum([a-b for a,b in zip(point,mean_2)])**2
    dist_Total_3 = sum([a-b for a,b in zip(point,mean_3)])**2

    if dist_Total_1 < dist_Total_2 & dist_Total_3: 
        df.loc[pointIDX,'class'] = 1

    elif dist_Total_2 < dist_Total_3 > dist_Total_1:
        df.loc[pointIDX, "class"] = 2

    else:
        df.loc[pointIDX,'class'] = 3

    return df

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这里有一些语法问题

    if dist_Total_1 < dist_Total_2 & dist_Total_3: 
        df.loc[pointIDX,'class'] = 1
    
    elif dist_Total_2 < dist_Total_3 > dist_Total_1:
        df.loc[pointIDX, "class"] = 2
    

    我相信你真正想要的是

    if dist_Total_1 < dist_Total_2 and dist_Total_1 < dist_Total_3: 
        df.loc[pointIDX,'class'] = 1
    
    elif dist_Total_2 < dist_Total_3 and dist_Total_2 < dist_Total_1:
        df.loc[pointIDX, "class"] = 2
    

    您的距离计算似乎也不符合我对欧几里得距离的理解。或许这样

    dist_Total_1 = sum([(a-b)**2 for a,b in zip(point,mean_1)])**0.5
    

    dist_Total_2dist_Total_3 以此类推。

    【讨论】:

    • 所以后面的数学是对的,只是语法错误?
    • 根据我对欧几里得距离的记忆,您希望对每个单独的减法进行平方,然后取这些项之和的平方根。
    • 我在答案中添加了一个样本距离度量,这符合我的想法。
    • 我知道某处有错误,因为我的 k-means 的输出没有对任何点进行分类。他们都直接上第一班。
    • 对。看起来你在那里已经很好了,所以我不管它。我不会更改您的 else 声明。
    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 2018-02-14
    • 2013-04-07
    • 2021-01-31
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多