K_means实现聚类iris数据集的三个数据,‘setosa‘,‘versicolor‘,‘virginica‘

主要用于保存记录,来源B站视频跟着大佬做的。

实现效果:

1.原始数据分类  2.原始数据未分类

1.原始数据分类   2.数据聚类后(‘x’是每个聚类的中心)

demo:

### demo
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from k_means import KMeans

# 导入数据
data = pd.read_csv("./iris.csv")
iris_types = ['setosa','versicolor','virginica']  # 数据类别

x_axis = 'Petal_Length' #x轴
y_axis = 'Petal_Width'  #Y轴
# 图的大小
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
for iris_type in iris_types: # 遍历每种花
    plt.scatter(data[x_axis][data['Species']==iris_type],data[y_axis][data['Species']==iris_type],label=iris_type)
plt.title('label know')
plt.legend()

plt.subplot(122)
plt.scatter(data[x_axis][:],data[y_axis][:])
plt.title('label unknow')

plt.show()

num_examples = data.shape[0] #样本个数
x_train = data[[x_axis,y_axis]].values.reshape(num_examples, 2)#将data的x,y轴数据转换成ndarry格式,并reshape,赋给x_train

#指定好训练所需的参数
num_clusters = 3
max_iterition = 50

KMeans = KMeans(x_train,num_clusters)
centroids, closest_centroids_ids = KMeans.train(max_iterition)

#画图对比
plt.figure(figsize=(12,5))  # 图的大小
plt.subplot(1,2,1)
for iris_type in iris_types: # 遍历每种花
    plt.scatter(data[x_axis][data ['Species']==iris_type],data[y_axis][data['Species']==iris_type],label=iris_type)
plt.title('label know')
plt.legend()

plt.subplot(1,2,2)
for centroids_id, centroid in enumerate(centroids):
    current_examples_index = (closest_centroids_ids == centroids_id).flatten()
    plt.scatter(data[x_axis][current_examples_index], data[y_axis][current_examples_index], label=centroids_id)

for centroids_id, centroid in enumerate(centroids):
    plt.scatter(centroid[0],centroid[1],c='black',marker='x')
plt.title('label KMeans')
plt.legend()
plt.show()

K_means.py:

### K_means
import numpy as np
# closest_centroids_ids里面存的是什么? ——>存的是每个数据距离中心点最小距离的簇的索引(1,2,3,...,K)

class KMeans:
    def __init__(self, data, num_clustres):  # 数据、K值
        self.data = data
        self.num_clustres = num_clustres

    def train(self, max_iterations):  # 最大迭代次数
        # 1在当前数据中,初始化随机选择K个中心点
        centroids = KMeans.centroids_init(self.data, self.num_clustres)
        # 2开始训练
        # 计算每个点到K个中心点的距离
        num_examples = self.data.shape[0]  # 数据个数
        closest_centroids_ids = np.empty((num_examples, 1))  # 创建空数组,存放寻找的最近的中心点
        for _ in range(max_iterations):  # 迭代max_iterations次
            # 3得到当前每个样本点到K个中心点的距离,找到最近的距离id
            closest_centroids_ids = KMeans.centroids_find_closest(self.data, centroids)  # 数据、中心点
            # 4进行中心点位置更新:closest_centroids_ids距离谁最近就属于哪个堆
            centroids = KMeans.centroids_computer(self.data, closest_centroids_ids, self.num_clustres) #数据、当前数据距离哪个点最近
        return centroids, closest_centroids_ids


    @staticmethod
    # num_clustres()方法:初始化随机的寻找当前data的num_clustres个中心点
    def centroids_init(data, num_clustres):
        num_examples = data.shape[0]  # 数据个数
        random_ids = np.random.permutation(num_examples)  # permutation:将数据随机排序
        # random_ids[:num_clustres]:选择从0到num_clustres个数据,前num_clustres个;后面的:表示所有的数据特征
        data = np.array(data)
        centroids = data[random_ids[:num_clustres], :]  # 选取后作为中心点
        return centroids

    @staticmethod
    # 计算距离中心的的最近的距离,存储在closest_centroids_ids中,返回
    def centroids_find_closest(data, centroids):
        # 计算方法:eg.欧氏距离
        num_examples = data.shape[0]  # 数据个数
        num_centroids = centroids.shape[0]  # 簇的个数:K
        closest_centroids_ids = np.zeros((num_examples, 1))  # 用于存储每个样本点距离簇最近的那一个
        for examples_index in range(num_examples):
            distance = np.zeros((num_centroids, 1))  # 存储每个样本点对K个簇的distance值
            for centroids_index in range(num_centroids):
                # 计算距离:数据点的坐标值-中心点的坐标值
                data = np.array(data)
                distance_diff = data[examples_index, :4] - centroids[centroids_index, :4]
                distance[centroids_index] = np.sum(distance_diff ** 2)
            # 对当前的样本找到距离最近的那个簇
            closest_centroids_ids[examples_index] = np.argmin(distance)  # np.argmin()返回最小值索引
        return closest_centroids_ids

    @staticmethod
    # 更新closest_centroids_ids里面距离谁最近,就放在哪个堆(簇)
    def centroids_computer(data, closest_centroids_ids, num_clustres):
        num_features = data.shape[1] # 输入的数据的特征个数
        # num_features: 用于各个特征分别算均值
        centroids = np.zeros((num_clustres,num_features))  # 簇的个数、特征个数
        for centroids_id in range(num_clustres):
###如何运行的?
            closest_ids = closest_centroids_ids == centroids_id
            centroids[centroids_id] = np.mean(data[closest_ids.flatten(),:], axis=0)
        return centroids

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面我将用中文回答您的问题。 首先,Iris数据集是一个经典的机器学习数据集,包含了三个不同品种的鸢尾花,每个品种各有50个样本,一共有150个样本。该数据集的每个样本包含了四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。 K-means算法是一种聚类算法,可以将数据集中的样本分成K个不同的簇。在K-means算法中,需要指定簇的个数K,然后算法会迭代地将样本分配到不同的簇中,直到收敛。每个簇的中心点即为该簇的代表点。 下面是利用Python代码实现K-means算法Iris数据集进行聚类的步骤,以及计算聚类结果的正确率和召回率的方法: 1. 导入所需的库和数据集 ```python import numpy as np from sklearn.datasets import load_iris from sklearn.cluster import KMeans from sklearn.metrics import confusion_matrix # 导入Iris数据集 iris = load_iris() X = iris.data y_true = iris.target ``` 2. 对数据集进行K-means聚类 ```python # 定义K-means算法对象,将簇的个数设为3(因为Iris数据集三个品种) kmeans = KMeans(n_clusters=3) # 对数据集进行聚类 kmeans.fit(X) # 获取聚类结果 y_pred = kmeans.labels_ ``` 3. 计算聚类结果的正确率和召回率 ```python # 计算混淆矩阵 cm = confusion_matrix(y_true, y_pred) # 计算正确率和召回率 accuracy = np.trace(cm) / np.sum(cm) recall = np.diag(cm) / np.sum(cm, axis=1) # 打印正确率和召回率 print("Accuracy:", accuracy) print("Recall:", recall) ``` 其中,正确率是指分类正确的样本数占总样本数的比例,召回率是指某个品种中被正确分类的样本数占该品种总样本数的比例。混淆矩阵是分类模型的评估指标之一,用于统计分类模型的分类情况。 完整代码如下: ```python import numpy as np from sklearn.datasets import load_iris from sklearn.cluster import KMeans from sklearn.metrics import confusion_matrix # 导入Iris数据集 iris = load_iris() X = iris.data y_true = iris.target # 定义K-means算法对象,将簇的个数设为3(因为Iris数据集三个品种) kmeans = KMeans(n_clusters=3) # 对数据集进行聚类 kmeans.fit(X) # 获取聚类结果 y_pred = kmeans ### 回答2: Iris数据集是一个经典的用于分类和聚类问题的数据集,其中包含150个样本,分为3个类别(SetosaVersicolorVirginica),每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)。要利用k-means算法完成Iris数据集聚类,以及输出聚类结果的正确率和召回率,可以按照以下步骤进行。 步骤一:导入必要的库和数据集 ``` import pandas as pd from sklearn.cluster import KMeans from sklearn.metrics import confusion_matrix # 导入Iris数据集 iris_data = pd.read_csv('iris.csv') ``` 步骤二:数据预处理 ``` X = iris_data.iloc[:, :-1] # 特征数据 y = iris_data.iloc[:, -1] # 类别标签 ``` 步骤三:定义k-means模型并训练数据 ``` kmeans = KMeans(n_clusters=3, random_state=42) kmeans.fit(X) ``` 步骤四:获取聚类结果并计算正确率 ``` # 获取聚类结果 labels = kmeans.labels_ # 将类别标签映射为数字 y_mapped = y.map({'Setosa': 0, 'Versicolor': 1, 'Virginica': 2}) # 计算正确率 accuracy = sum(labels == y_mapped) / len(y_mapped) ``` 步骤五:计算召回率 ``` # 计算混淆矩阵 cm = confusion_matrix(y_mapped, labels) # 计算召回率 recall = cm.diagonal() / cm.sum(axis=1) ``` 最后,输出正确率和召回率结果 ``` print("正确率:", accuracy) print("召回率:", recall) ``` 以上是利用k-means算法完成Iris数据集聚类,并输出聚类结果的正确率和召回率的代码实现。注意,由于k-means算法是一种无监督学习方法,没有直接的类别标签,因此正确率和召回率的计算是基于与真实标签的匹配程度来进行评估。 ### 回答3: 在Python中,我们可以使用scikit-learn库来完成Iris数据集聚类,并计算聚类结果的正确率和召回率。 首先,我们需要导入所需的库和数据集: ```python from sklearn.datasets import load_iris from sklearn.cluster import KMeans from sklearn.metrics import accuracy_score, recall_score # 加载Iris数据集 iris = load_iris() X = iris.data y = iris.target ``` 然后,我们可以使用KMeans算法进行聚类: ```python # 实例化KMeans模型并进行聚类 kmeans = KMeans(n_clusters=3, random_state=0) kmeans.fit(X) labels = kmeans.labels_ ``` 接下来,我们可以计算聚类结果的正确率和召回率: ```python # 计算正确率和召回率 accuracy = accuracy_score(y, labels) recall = recall_score(y, labels, average='macro') # 输出结果 print("正确率:", accuracy) print("召回率:", recall) ``` 完整的代码如下: ```python from sklearn.datasets import load_iris from sklearn.cluster import KMeans from sklearn.metrics import accuracy_score, recall_score # 加载Iris数据集 iris = load_iris() X = iris.data y = iris.target # 实例化KMeans模型并进行聚类 kmeans = KMeans(n_clusters=3, random_state=0) kmeans.fit(X) labels = kmeans.labels_ # 计算正确率和召回率 accuracy = accuracy_score(y, labels) recall = recall_score(y, labels, average='macro') # 输出结果 print("正确率:", accuracy) print("召回率:", recall) ``` 运行代码后,即可得到聚类结果的正确率和召回率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值