聚类,分类问题?

根据科罗拉多州罗斯国家森林区域树木类型的观测数据covtype.csv,实现树木类型识别任务

import pandas as pd
import numpy as np
import time
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

# 初始化质心
def initialize_centroids(data, k):
    indices = np.random.choice(len(data), k, replace=False)
    return data[indices]

# 分配数据点到最近的质心
def get_clusters(data, centroids):
    cluster_labels = np.zeros(len(data))
    for i, point in enumerate(data):
        distances = np.linalg.norm(point - centroids, axis=1)
        cluster_labels[i] = np.argmin(distances)
    return cluster_labels

# 更新质心
def update_centroids(data, cluster_labels, k):
    new_centroids = np.zeros((k, data.shape[1]))
    for i in range(k):
        cluster_points = data[cluster_labels == i]
        new_centroids[i] = np.mean(cluster_points, axis=0)
    return new_centroids

# K-Means聚类主函数
def k_means(data, k, T, epsilon):
    start = time.time()  # 开始时间,计时
    centroids = initialize_centroids(data, k)
    t = 0
    while t <= T:
        cluster_labels = get_clusters(data, centroids)

        new_centroids = update_centroids(data, cluster_labels, k)

        if np.linalg.norm(new_centroids - centroids) < epsilon:
            break
        centroids = new_centroids
        print("第", t, "次迭代")
        t += 1
    print("用时:{0}".format(time.time() - start))
    return cluster_labels, centroids

# 聚类结果的可视化
def visualize_clusters(data_scaled, cluster_labels):
    unique_clusters = np.unique(cluster_labels)
    colors = plt.cm.jet(np.linspace(0, 1, len(unique_clusters)))
    for i, cluster in enumerate(unique_clusters):
        cluster_data = data_scaled[cluster_labels == cluster]
        plt.scatter(cluster_data[:, 0], cluster_data[:, 1], c=colors[i], label=f'Cluster {i+1}')
    plt.title('K-Means Clustering')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.legend()
    plt.grid(True)
    plt.show()

# 主程序
if __name__ == "__main__":
    # 读取数据集
    data_path = r'D:/360zip/机器学习实验课材料/covtype.csv' # 替换为您的实际文件路径
    data = pd.read_csv(data_path)

    # 数据预处理:缩放特征
    scaler = MinMaxScaler()
    data_scaled = scaler.fit_transform(data)

    # 执行K-Means聚类
    k = 7  # 聚类的数量
    T = 10  # 最大迭代次数
    epsilon = 1e-5  # 收敛阈值
    cluster_labels, centroids = k_means(data_scaled, k, T, epsilon)

    # 可视化聚类结果
    visualize_clusters(data_scaled, cluster_labels)

聚类之后,发现可视化的图不是自己想要的,我想要的是每个颜色都有自己的区域,但是运行结果不如意

到底要聚类还是分类啊

阅读 923
avatarAI BotBETA

根据您提供的信息,您正在处理一个聚类问题,即使用K-Means算法对科罗拉多州罗斯国家森林区域树木类型的观测数据进行分组。聚类是一种无监督学习方法,用于发现数据中的内在结构和模式,将相似的数据点组织成组(或称为“簇”)。

关于您提到的可视化结果不如预期,这可能是由于多个原因造成的。以下是一些可能的解释和建议:

  1. 特征选择:您只选择了前两个特征进行可视化(cluster_data[:, 0]cluster_data[:, 1])。K-Means算法实际上在所有特征上进行操作,而不仅仅是这两个。如果其他特征对聚类结果有重要影响,那么仅基于这两个特征的可视化可能无法准确反映实际的聚类结构。
  2. 聚类数量:您选择了k=7作为聚类的数量。这个选择可能并不总是最佳的。您可能需要尝试不同的k值,或者使用一些方法来自动确定最佳的聚类数量(例如,肘部法则或轮廓分析)。
  3. 数据预处理:虽然您已经使用了MinMaxScaler对特征进行了缩放,但可能还需要进行其他预处理步骤,例如处理缺失值、异常值或进行特征选择。
  4. 算法参数:您已经设置了最大迭代次数T和收敛阈值epsilon。这些参数的选择也可能影响聚类的结果。尝试调整这些参数可能会得到更好的聚类效果。
  5. 聚类算法的选择:K-Means算法有其局限性,例如对初始质心的选择敏感,以及对非凸形状或大小差异较大的簇可能效果不佳。如果K-Means不能得到满意的结果,您可以考虑尝试其他聚类算法,如层次聚类、DBSCAN或谱聚类。

关于“到底要聚类还是分类啊”的问题,这取决于您的具体任务和目标。聚类是一种无监督学习方法,用于发现数据中的内在结构和模式。而分类是一种监督学习方法,需要使用已知的标签来训练模型,以便对新的未标记数据进行预测。在您的情况下,如果您有树木类型的标签信息,并且想要使用这些信息来训练一个模型以预测新数据的类别,那么您应该使用分类方法。但是,根据您提供的代码和描述,您正在执行的是一个聚类任务,因为您没有使用任何标签信息,而是让算法自动将数据分成几个簇。

1 个回答
新手上路,请多包涵

如果已经有各类树木的名称维度,用分类

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题