关于Scikit-learn中KMeans聚类仅输入X轴值的疑问
关于Scikit-learn KMeans只传X轴的困惑解答
嘿,这个问题问得太戳中新手痛点了——刚上手聚类和Scikit-learn的时候,很多人都会在特征维度这里绕晕!咱们一步步拆解清楚:
首先,你代码里的关键细节:传入的是「单特征一维数据」,而非完整的二维坐标
你写的kmeans.fit(df["x"]),这里的df["x"]是Pandas的Series,形状是(3,)(对应3个样本)。而Scikit-learn的聚类模型要求输入是二维数组(样本数量 × 特征数量),所以它会自动把这个一维Series转换成形状为(3,1)的二维数组——简单说,就是把每个x值当成一个独立的「单特征样本」,完全没用到y列的数据。
那模型怎么计算距离?用的是一维空间的欧氏距离
你熟悉的二维欧氏距离公式是sqrt( (x2-x1)^2 + (y2-y1)^2 ),但如果是只有x这一个特征的一维场景,公式就简化成了|x2 - x1|(根号里只有(x2-x1)^2,开根号就是绝对值)。这时候模型是在一维数轴上对x值分组,比如你的例子里x是5、6、7,分成2类的话,可能会把5单独归为一类,6和7归为另一类,和y的8、9、10完全没关系。
怎么让模型用到X和Y两个维度?
如果你想实现最初理解的「二维空间相似点分组」,必须把两个特征都传给模型,代码要改成:
from sklearn.cluster import KMeans kmeans = KMeans(2) # 用双层方括号,得到形状为(3,2)的二维数组,包含x和y两个特征 kmeans.fit(df[["x", "y"]])
这时候模型才会用你熟悉的二维欧氏距离公式,对(x,y)坐标点进行聚类。
最后再划个重点
- 只传
df["x"]时,模型完全丢弃了y列数据,做的是一维聚类,和你最初想的二维坐标分组不是一回事 - Scikit-learn的聚类模型默认处理「多特征样本」,输入必须是二维数组(哪怕只有一个特征,也要转成
(n,1)的形状) - 要实现二维空间的点聚类,一定要传入包含所有需要用到的特征的数组
内容的提问来源于stack exchange,提问作者Alireza Hosseini
相关产品推荐
相关产品推荐

