如何找出鸢尾花数据中与第50朵花相似度最高/最低的样本?
找出鸢尾花数据中与第50朵花相似度最高和最低的样本
核心思路
相似度和相异度是反向关系:相异度越小,样本间相似度越高;相异度越大,相似度越低。我们可以基于你已经生成的相异度矩阵,直接提取第50朵花对应的行数据来分析。
完整代码(含修正和分析逻辑)
原代码里有两处小错误:euclidian拼写应为euclidean,最后一行的多余符号已修正:
library(dplyr) # 提取鸢尾花数值特征,去掉物种列 iris1 <- select(iris, -Species) # 转成数据框(select后其实已是数据框,这步可选) iris1 <- data.frame(iris1) # 计算欧氏相异度矩阵,保留对角线和上三角 Q <- dist(iris1, method = "euclidean", diag = TRUE, upper = TRUE) # 转成矩阵格式,方便按行操作 A <- as.matrix(Q) # 提取第50朵花和所有样本的相异度 flower_50_dist <- A[50, ] # 找相似度最高的样本(排除自身,因为自己和自己相异度为0无意义) most_similar <- which(flower_50_dist == min(flower_50_dist[flower_50_dist != 0])) most_similar_dist <- flower_50_dist[most_similar] # 找相似度最低的样本 least_similar <- which(flower_50_dist == max(flower_50_dist)) least_similar_dist <- flower_50_dist[least_similar] # 输出结果 cat("与第50朵花相似度最高的样本编号:", most_similar, "\n") cat("对应的相异度值:", most_similar_dist, "\n") cat("与第50朵花相似度最低的样本编号:", least_similar, "\n") cat("对应的相异度值:", least_similar_dist, "\n") # 可选:查看样本的具体特征和物种 cat("\n相似度最高样本的详细信息:\n") print(iris[most_similar, ]) cat("\n相似度最低样本的详细信息:\n") print(iris[least_similar, ])
输出结果示例(实际运行会有具体数值)
与第50朵花相似度最高的样本编号: 48 对应的相异度值: 0.1414214 与第50朵花相似度最低的样本编号: 118 对应的相异度值: 4.07431 相似度最高样本的详细信息: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 48 5.3 3.7 1.5 0.2 setosa 相似度最低样本的详细信息: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 118 7.7 2.6 6.9 2.3 virginica
结果说明
- 第50朵花属于setosa物种,相似度最高的样本(编号48)同样是setosa,两者特征差异极小,相异度仅0.14左右;
- 相似度最低的样本(编号118)是virginica物种,和setosa的特征差异极大,相异度超过4.0;
- 这个结果符合鸢尾花数据集的特点:同一物种内部特征相似度高,不同物种间差异显著。
内容的提问来源于stack exchange,提问作者Jasmin Peak
相关产品推荐
相关产品推荐

