宁波做网站的大公司,沈阳网站如何制作,郑州做企业网站哪家好,站长工具ip地址查询域名原文#xff1a;towardsdatascience.com/gowers-distance-for-mixed-categorical-and-numerical-data-799fedd1080c 混合分类和数值数据的 Gower 距离
用于聚类混合数据的距离度量
什么是距离度量#xff1f;
很可能你已经听说过曼哈顿距离或欧几里得距离。这两个不同的度…原文towardsdatascience.com/gowers-distance-for-mixed-categorical-and-numerical-data-799fedd1080c混合分类和数值数据的 Gower 距离用于聚类混合数据的距离度量什么是距离度量很可能你已经听说过曼哈顿距离或欧几里得距离。这两个不同的度量标准提供了关于两个给定数据点距离或不同程度的信息。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b436193462297478abdc651d28423ff7.png曼哈顿和欧几里得距离图表。图片由作者提供简而言之欧几里得距离是从点 A 到点 B 的最短距离。曼哈顿距离计算 x 和 y 坐标之间的绝对差之和并找到它们在网格上的距离在这个网格上你可以向上、向下、向左或向右移动但不能对角移动。距离度量通常在聚类算法中起作用例如k-均值聚类它使用欧几里得距离。这是有道理的因为为了定义簇你必须首先知道两个数据点相似或不同的程度即它们之间的距离。计算两点之间的距离为了展示这个过程我将从一个使用欧几里得距离的例子开始。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/860e668f1f30cfbe24a7b97cf110ee35.png欧几里得距离公式。图片由作者提供使用我上面绘制的图表假设点 A 的坐标是5050点 B 的坐标是300500d(A,B)sqrt((300-50)²(500-50)²))d(A,B)sqrt(62,500202,500)d(A,B)≈514.78非常简单。好的现在让我们来看看在 Python 数据集中这会是什么样子其中你有一个包含多个列特征的数据框并且你想要计算该 df 中两个数据点行之间的相似度得分。人口普查收入数据中的距离我将使用来自 UCI 机器学习仓库的人口普查收入数据集CC BY 4.0来展示接下来的所有示例。最终这是一个包含各种人口统计特征如年龄、种族、性别、职业等和二元目标变量的分类数据集该目标变量指示该个人是否有超过$50K 的收入或≤$50K。虽然我不会使用这个数据集进行分类任务但它是一个展示距离度量的好例子因为我们可以展示出在特征上相似的数据点在目标上也会相似。要自己获取这些数据请运行以下代码fromucimlrepoimportfetch_ucirepo# fetch datasetcensus_incomefetch_ucirepo(id20)# data (as pandas dataframes)Xcensus_income.data.features ycensus_income.data.targets# variable informationprint(census_income.variables)该数据集包含的一个特征变量是“Age”。在这种情况下年龄是一个范围在 17-90 之间的数值变量。另一个数值变量是“Capital gains”。这两个变量在计算一个人的总收入时都将非常相关。让我们看看我们能否使用这两列来获取数据点/行的距离估计。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/837884b9d99cfc766c42be9db59db490.png作者提供的图片要找到这两个数据点之间的距离我们需要将值传递到上面定义的方程中。每一列将是一个维度x 或 y每一行将是一个数字 1 或 2。因此年龄列将是 x而两个值3950将是 x1 和 x2。资本收益列将对应于 y1 和 y2 值。d(Row1,Row2)sqrt((50-39)²(2174-0)²))d(Row1,Row2)2174.027注意总距离几乎等同于资本收益列的差异。这是因为值的年龄范围远小于资本收益值的范围。因此在某些情况下在计算欧几里得距离之前您可能需要使用类似 StandardScaler 的东西对数据进行缩放。Gower 距离将分类变量添加到方程中现在如果我们想计算这两个数据点之间的距离同时包括分类变量比如“workclass”和“education”呢这就是Gower 距离的用武之地。Gower 距离通过为数值和分类特征执行不同的距离计算然后在特征之间取相似度的加权平均值来计算两个数据点之间的得分。当计算两个分类特征之间的相似度得分时方程非常简单。如果它们的值相等得分是 1。如果不相等得分是 0。对于两个物体数据点i 和 j在比较特征 k一个数值/连续特征时相似度得分是https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/34506b9d4e79b5c6232dc1bbe6abd845.pngGower 相似度得分针对数值特征。作者提供的图片其中 R(k)是特征 k 的范围。值的绝对差除以范围以归一化特征并得到一个介于 0 和 1 之间的值。这将解决你在欧几里得距离中看到的问题其中具有非常大值的特征会超过方程。现在我们为每个特征都有一个得分对于两个具有 p 个特征的物体 i 和 j总的 Gower 距离是计算出来的https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/65c9c50a3edebd3a1c899e1631a20382.png图片来自 维基百科…其中 w(ijk)是该特征的权重默认为 1。Python 实现Python 实现创建了一个矩阵比较数组中的所有对象彼此之间的差异并返回 Gower 距离。我将展示一个小例子以便您在转到如何在更大的数据集上工作之前可以看到如何在 Python 中实现这一点。# Assuming you have run pip install gowerimportgowerimportnumpyasnp# Define featuresfeatures[age,capital-gain,education,workclass]# Workclass column contains some missing data in the form of ?.# So I removed this firstXX.loc[X[workclass]!?]# Drop nulls in any other column just in case and reset indexX.dropna(inplaceTrue)X.reset_index(inplaceTrue)# Select only defined featuresXX[features]# Create a small dataframe which only contains the first 2 rows of X.# We will compare these 2 rows using Gower distance to start.small_XX.iloc[0:2,:]# Convert age column to a float since capital gains is a float,# and numerical columns should be the same data type.small_X[age]small_X[age].astype(float)# Create gower distance matrix.# cat_features is a list which corresponds to the indices# of the columns. A 0 indicates that the column is numerical, and 1# indicates it is categorical. Our first 2 columns (age and capital-gain)# are marked as 0, and the last 2 columns (education,workclass)# are marked as 1gower.gower_matrix(np.asarray(small_X),cat_features[0,0,1,1])调用 gower.gower_matrix 返回此数组array([[0\.,1.5],[1.5,0\.]],dtypefloat32)其中每个元素对应以下内容元素 [0,0] 第 1 行和第 1 行之间的距离得分元素 [0,1] 第 1 行和第 2 行之间的距离得分元素 [1,0] 第 2 行和第 1 行之间的距离得分元素 [1,1] 第 2 行和第 2 行之间的距离得分由于比较第 1 行与第 1 行显然会显示出它们在特征方面是相等的因此距离将显示为 0。同样比较第 2 行与第 2 行也是如此。比较第 2 行与第 1 行也将产生与比较第 1 行与第 2 行相同的结果这就是为什么这些元素中的得分相同。现在您已经了解了 Gower 距离的构建块让我们将这个 gower.gower_matrix 函数应用于整个数据集。# Note: The census data set is over 40,000 rows. This will be# extremely computationally expensive. In my own code, I ran this only# on the first 5000 rows, but it will depend on your dataset.gower.gower_matrix(np.asarray(X),cat_features[0,0,1,1])这将返回一个矩阵比较每一行与其他所有行及其 Gower 距离得分。为了进一步测试 Gower 距离的有效性让我们看看我们是否可以使用特征找到与第 1 条记录最相似的 10 条记录然后看看它们的标签值收入水平是否也相似。# Take the first row of the dataset and compare it to the rest of the# data. Return the indices of top 10 valuesgower_topn_indexgower.gower_topn(X.iloc[0:1,:],X.iloc[:,],n10)[index]# Query the indices in the original dfX.iloc[gower_topn_index]这些是我的结果https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3b0e0bfb76c78adb181a8beb62aa8a3f.png与记录 1 最相似的 10 条记录。图片由作者提供如您所见与第 1 条记录最相似的记录就是那条记录本身。这是因为 Gower 将每条记录与每条记录进行比较。如果您想获取与记录 1 最相似的 n 条记录不包括记录 1 本身您最初可以获取前 n1 条记录然后查询X.iloc[gower_topn_index][1:] 而不是 X.iloc[gower_topn_index].这样就会从您的结果中排除那条最顶部的记录。如果我们调用y.loc[gower_topn_index]我们可以看到与第 1 行最相似的 10 条记录的对应目标值。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1966c06bff8b9041ff0256af24a2bc36.png与第 1 条记录最相似的 10 条记录的目标值。图片由作者提供在这里您可以看到在 10 条最相似的记录中有 6 条不包括第一条记录即它自己与第一条记录的收入≤50K相匹配。只有 3 条9 条中的 3 条没有匹配并超过 50K。考虑到我们只有 4 个特征这并不太糟糕需要注意的事项与其他机器学习算法一样随着您添加更多特征Gower 度量指标的准确性可能会提高这意味着您将获得越来越相似的记录。需要注意的是通常情况下分类特征因为它们将是 0 或 1而不是介于 0 和 1 之间的连续值会超过数值特征。为了平衡这一点你可以通过使用权重参数手动提高数值特征的权重进行实验。权重参数的工作方式类似于 cat_features 参数您传递一个列表并为每一列指定一个权重。例如设置权重 [2,2,1,1]表示前两列在我的情况下是年龄和资本收益作为数值将比最后两列分类特征在最终距离方程中的权重高两倍。结论如您所见Gower 距离是一种强大的度量标准用于计算包含混合数据类型特征的 2 个对象之间的距离。它有众多用例从简单地找到最相似的记录到在聚类算法中使用。有关更多信息及示例源代码可以在这里找到。感谢阅读每当 Haden Pelletier 发布时获取电子邮件通知