R语言 如何创建一个距离矩阵
距离矩阵 是一个包含数据集中每对元素之间距离的矩阵。在R编程语言中,有几个函数可用于创建距离矩阵,如 dist()、daisy()和vegdist() ,分别来自统计、集群和vegan包。
- 距离度量: 距离度量是一个定义数据集中两个元素之间距离的函数。常见的距离度量包括欧氏距离、曼哈顿距离和余弦相似度。
- 分类变量: 分类变量是指可以取有限数值之一的变量。在创建距离矩阵时,分类变量需要与数字变量不同的处理方式。
- 缺少的 数据: 缺少的数据是指在数据集中的某些元素无法获得的数据。当创建一个距离矩阵时,缺失数据需要与非缺失数据进行不同的处理。
欧氏距离矩阵
欧氏距离是对欧氏空间中两点之间直线距离的测量。欧氏距离的数学公式如下。
其中d(p, q)是两点p和q之间的欧氏距离,q1 , q2 , . . , qn 和p1 , p2 , . . ., pn 是两点在n维空间中的坐标。在二维空间中,两点(x1 , y1 )和(x2 , y2 )之间的欧氏距离可以用以下公式计算。
# Create a matrix of data
data <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8),
nrow = 4, ncol = 2)
# Create an Euclidean distance matrix
euclidean_matrix <- dist(data)
# Print the distance matrix
print(euclidean_matrix)
输出
1 2 3
2 2.8284271
3 5.65685439 5.65685439
4 8.48528137 8.48528137 8.48528137
这个输出是一个距离矩阵,其中i,j处的值是数据矩阵中第i行和第j行之间的欧氏距离。dist()函数默认计算欧氏距离,所以你不需要明确指定方法为 “euclidean”。
高尔距离矩阵
高尔距离是一种 ,可以用来比较具有混合类型属性(例如,分类和数字)的观察结果。在处理既有连续变量又有分类变量的数据集时,它经常被用于聚类和分类任务。
其中d(x, y)是观测值x和y之间的Gower距离,p是属性的数量,wi 是第i个 属性的权重,di (xi , yi )是第i个属性对距离的贡献。每个属性的贡献可以是不同的,取决于属性的类型。
# create a sample data frame with mixed data types
df <- data.frame(
numeric_var = c(1,2,3,4),
categorical_var = c("A", "B", "A", "C"),
binary_var = c(0,1,0,1)
)
# calculate the mean and range of the numeric variable
mean_numeric_var <- mean(dfnumeric_var)
range_numeric_var <- range(dfnumeric_var)
# normalize the numeric variable
dfnumeric_var <- (dfnumeric_var - mean_numeric_var) / range_numeric_var
# convert categorical variable to binary
dfcategorical_var <- ifelse(dfcategorical_var == "A", 1, 0)
# convert binary variable to binary
dfbinary_var <- as.numeric(dfbinary_var)
# initialize the Gower distance matrix
gower_distance_matrix <- matrix(0, nrow = nrow(df),
ncol = nrow(df))
# calculate the Gower distance between each pair of rows
for (i in 1:nrow(df)) {
for (j in 1:nrow(df)) {
gower_distance_matrix[i,j] <- (
abs(dfnumeric_var[i] - dfnumeric_var[j]) +
abs(dfcategorical_var[i] - dfcategorical_var[j]) +
abs(dfbinary_var[i] - dfbinary_var[j])
) / 3
}
}
# output
print(gower_distance_matrix)
输出
[,1] [,2] [,3] [,4]
[1,] 0.0000000 1.1250000 0.6666667 1.2916667
[2,] 1.1250000 0.0000000 0.8750000 0.1666667
[3,] 0.6666667 0.8750000 0.0000000 0.7083333
[4,] 1.2916667 0.1666667 0.7083333 0.0000000
在这个例子中,代码首先通过从每个值中减去变量的平均值,再除以变量的范围来对数字变量进行标准化。这有助于将所有的变量放在同一个尺度上进行比较。接下来,分类变量和二进制变量被转换为二进制形式,其中每个值要么是1,要么是0。这是对分类变量使用 “ifelse “语句,对二进制变量使用 “as.numeric “转换。
最后,每对行之间的高尔距离被计算出来并存储在一个矩阵中。该距离被计算为两行中每个变量之间绝对差异的平均值,除以变量的数量。得到的矩阵可以用来确定数据框中每对行之间的相似度。
雅卡德距离矩阵
雅卡德距离 ,也被称为雅卡德相似系数,是衡量两个集合之间相似性的 。它被广泛用于自然语言处理、信息检索和生物信息学等领域。雅卡德相似性系数的数学公式定义为:。
J(A,B) = |A ∩ B| / |A ∪ B|
其中J(A, B)是集合A和B之间的Jaccard相似系数,|A|和|B|是集合A和B的cardinality,|A∩B|是A和B的交集的cardinality。为了得到Jaccard的距离,我们需要用1减去Jaccard的相似度。
Jaccard Distance = 1 - Jaccard Similarity Coefficient
雅卡德距离是一个从0到1的度量,值为0表示集合是相同的,值为1表示集合没有共同的元素。
# create a sample data frame with mixed data types
df <- data.frame(
numeric_var = c(1,2,3,4),
categorical_var = c("A", "B", "A", "C"),
binary_var = c(0,1,0,1)
)
# convert categorical variable to binary
dfcategorical_var <- ifelse(dfcategorical_var == "A", 1, 0)
# convert binary variable to binary
dfbinary_var <- as.numeric(dfbinary_var)
# calculate the Jaccard distance
# matrix using the dist function
jaccard_distance_matrix <- dist(df,
method = "binary")
#Print the distance matrix
print(jaccard_distance_matrix)
输出
1 2 3
2 0.6666667
3 0.0000000 0.6666667
4 0.6666667 0.0000000 0.6666667
在这个例子中,代码将一个具有混合数据类型(数字、分类、二进制)的样本数据框转换为二进制格式,并使用dist函数计算Jaccard距离矩阵。分类变量和二进制变量分别使用ifelse和as.numeric函数转换为二进制。结果是Jaccard距离矩阵,它表示数据框中每一行之间的成对距离。该结果被打印出来,可用于进一步的分析或可视化。
曼哈顿距离矩阵
曼哈顿距离,也被称为L1距离,是衡量 欧几里得空间中两点之间的距离。它被计算为其坐标之间的绝对差异之和。与测量两点之间的 “直线 “距离的欧几里得距离不同,曼哈顿距离测量两点之间的距离,就像你在一个网格状的城市中导航一样,始终只在水平或垂直方向上移动,就像曼哈顿的出租车。
二维空间中两点(x1 , y1 )和(x2 , y2 )之间的曼哈顿距离的数学公式是:。
d(p,q) = |x 1 - x2| + |y1 - y2|
而对于n维空间来说,该公式为。
其中d(p, q)是两点p和q之间的曼哈顿距离,q(i)和p(i)是n维空间中的点的坐标。
# Create a matrix of data
data <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8),
nrow = 4, ncol = 2)
# Create a Manhattan distance matrix
manhattan_matrix <- dist(data,
method = "manhattan")
# Print the distance matrix
print(manhattan_matrix)
输出
1 2 3
2 2
3 4 2
4 6 4 2
堪培拉距离矩阵
堪培拉距离是衡量多维空间中两点之间 的差异性。它被定义为两点坐标之间的绝对差异之和除以其坐标之和,如下所示。
其中d(x,y)是两点x和y之间的堪培拉距离,n是空间中的维数。xi 和yi 是第 i个维度中两点的坐标。这种距离测量方法在处理序数或分类数据时特别有用,因为它对数据的尺度比其他距离测量方法(如欧氏距离)更不敏感。与曼哈顿距离等其他距离测量方法相比,堪培拉距离对异常值的存在也不太敏感。
# Create a matrix of data
data <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8),
nrow = 4, ncol = 2)
# Create a Canberra distance matrix
canberra_matrix <- dist(data,
method = "canberra")
# Print the distance matrix
print(canberra_matrix)
输出
1 2 3
2 0.4242424
3 0.6666667 0.2769231
4 0.8307692 0.4761905 0.2095238