基于 K-Means 对 IRIS 数据集分类

本文深入探讨了使用SKLearn库进行K-Means聚类的实践过程,通过IRIS数据集的分类任务,展示了聚类算法在无监督学习中的应用。从算法原理到具体实现,包括数据预处理、模型训练、结果评估,提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于sklearn 对 IRIS 数据集分类

关于聚类

聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中。簇内的对象越相似,聚类的效果越好。

关于 K-Means

K-Means算法是最为经典的基于划分的聚簇方法,是十大经典数据挖掘算法之一。简单的说K-Means就是在没有任何监督信号的情况下将数据分为K份的一种方法。聚类算法就是无监督学习中最常见的一种,给定一组数据,需要聚类算法去挖掘数据中的隐含信息。聚类算法的应用很广:顾客行为聚类,google新闻聚类等。

具体的算法步骤如下:

  1. 随机选择K个中心点
  2. 把每个数据点分配到离它最近的中心点;
  3. 重新计算每类中的点到该类中心点距离的平均值
  4. 分配每个数据到它最近的中心点;
  5. 重复步骤3和4,直到所有的观测值不再被分配或是达到最大的迭代次数(R把10次作为默认迭代次数)。

sklearn 实现

from sklearn import datasets
from sklearn.cluster import KMeans
import numpy as np

def mode(a):
	```求众数子函数```
    counts = np.bincount(a)  
    return np.argmax(counts)

def calc_acc(y_p, y):
	```计算准确率子函数```
    return sum(y_p==y)/y.shape[0]


if __name__ == '__main__':
    
    iris = datasets.load_iris()

    x = iris.get('data')
    y = iris.get('target')

    # 随机划分训练集和测试集
    num = x.shape[0] # 样本总数
    ratio = 7/3 # 划分比例,训练集数目:测试集数目
    num_test = int(num/(1+ratio)) # 测试集样本数目
    num_train = num -  num_test # 训练集样本数目
    index = np.arange(num) # 产生样本标号
    np.random.shuffle(index) # 洗牌
    x_test = x[index[:num_test],:] # 取出洗牌后前 num_test 作为测试集
    y_test = y[index[:num_test]]
    x_train = x[index[num_test:],:] # 剩余作为训练集
    y_train = y[index[num_test:]]

    kmeans = KMeans(n_clusters=3)
    kmeans.fit(x_train)

    centers = kmeans.cluster_centers_
    for i in range(3):
        index = y_train == i
        p = kmeans.predict(x_train[index,:])
        pp = mode(p) # 求实际类别为 i 所对应的类别标号 pp
        kmeans.cluster_centers_[i] = centers[pp] # 相应的调整类别标号,以正确预测

    y_test_pre = kmeans.predict(x_test)
    print("y_test_pre:")
    print(y_test_pre)
    print("y_test:")
    print(y_test)

    # 计算分类准确率
    acc = calc_acc(y_test_pre, y_test)
    print('the accuracy is', acc) # 显示预测准确率

运行结果:

在这里插入图片描述

### 实现K-Means算法对鸢尾花数据集进行分类 为了使用K-Means算法对鸢尾花数据集进行分类,在Python中可以采用`sklearn.cluster.KMeans`模块来完成这一过程。下面是一个完整的实现案例,其中包括加载数据、模型训练以及预测部分。 #### 导入必要的库并准备数据 首先需要导入所需的库,并准备好用于分析的数据集: ```python from sklearn import datasets from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans import pandas as pd # 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data # 特征变量 y = iris.target # 类别标签 # 数据标准化处理 scaler = StandardScaler().fit(X) X_scaled = scaler.transform(X) df_X = pd.DataFrame(X_scaled, columns=iris.feature_names) ``` 这段代码完成了鸢尾花数据集的加载与特征缩放操作[^2]。 #### 构建和评估K-Means模型 接下来构建K-Means聚类器并对不同数量簇的情况下的轮廓系数(Silhouette Score)进行了计算,以此找到最优的簇数: ```python for k in range(2, 10): k_means_fit_k = KMeans(n_clusters=k, max_iter=300, n_init=10).fit(X_scaled) score = silhouette_score(X_scaled, k_means_fit_k.labels_, metric='euclidean') print(f'对于K值 {k} ,Silhouette分数: %.3f' % score) ``` 此段脚本通过循环迭代不同的K值范围(从2到9),每次运行时都会创建一个新的K-Means实例,并打印对应的轮廓系数得分以帮助判断最佳集群数目[^1]。 #### 进行最终的K-Means聚类 一旦确定了合适的簇的数量之后就可以执行正式的K-Means聚类了: ```python optimal_k = ... # 基于前面的结果选择最合适的K值 final_model = KMeans(n_clusters=optimal_k, random_state=42).fit(X_scaled) predictions = final_model.predict(X_scaled) ``` 这里假设已经根据之前的实验选择了最适合的K值作为参数传给`KMeans()`函数来进行最后一次拟合;随后利用`.predict()`方法得到每个样本所属类别标记。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值