You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用K=5的KNN算法分析随机0-1数据及解决二分类标签问题

解决KNN聚类误用分类器的问题

你这里的核心问题是混淆了监督学习的KNN分类和无监督学习的聚类任务:

  • KNeighborsClassifier是分类模型,必须依赖已知的离散类别标签(比如0/1)才能训练,属于监督学习范畴;
  • 而你要做的“寻找聚类”是无监督任务——不需要预设标签,算法会自动根据样本的相似性完成分组。

所以你不需要给模型提供所谓的“因变量y”,反而应该把生成的x和y组合成样本的二维特征,用无监督聚类算法实现需求。

正确实现方案(基于K-Means,对应k=5的聚类需求)

下面是修改后的代码,直接完成随机样本生成、k=5聚类以及结果可视化:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 生成20个(x,y)二维样本,取值0-1之间
np.random.seed(0)  # 固定随机种子,确保结果可复现
data = np.random.rand(20, 2)  # 每行对应一个(x,y)样本

# 初始化K-Means模型,指定聚类数k=5
kmeans = KMeans(n_clusters=5, random_state=0)
# 执行聚类,得到每个样本的簇标签
cluster_labels = kmeans.fit_predict(data)

# 整理结果为DataFrame,方便查看
result_df = pd.DataFrame({
    'X': data[:, 0],
    'Y': data[:, 1],
    'Cluster_ID': cluster_labels
})
print("聚类结果详情:")
print(result_df)

# 可视化聚类效果
plt.scatter(data[:, 0], data[:, 1], c=cluster_labels, cmap='viridis', s=60, edgecolors='white')
# 标记每个簇的中心点
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], 
            c='red', marker='X', s=120, label='Cluster Centers')
plt.xlabel('X Value')
plt.ylabel('Y Value')
plt.title('K-Means Clustering with k=5')
plt.legend()
plt.show()

关键细节解释

  1. 特征矩阵构造:把原来分开的x和y合并成二维数组,因为聚类需要基于样本的完整特征(这里就是坐标)计算相似度。
  2. 为什么选K-Means:它是最常用的基于距离的聚类算法,和你提到的"k=5的KNN聚类"逻辑一致——都是通过样本间的距离判断相似性,只是K-Means是无监督场景下的标准实现。
  3. 原代码的问题:你把随机生成的y当成了分类任务的标签,但这个y本身是无意义的随机值,既不是真实类别,也不符合分类器对标签的要求(离散类别),所以会报错或得到无意义的结果。

内容的提问来源于stack exchange,提问作者aesoftware

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:30:57