kmeans算法python实现(iris数据集)

首先从sklearn里面载入iris数据集

如下所示

Sepal_Length  Sepal_Width  Petal_Length  Petal_Width  Species
0             5.1          3.5           1.4          0.2        0
1             4.9          3.0           1.4          0.2        0
2             4.7          3.2           1.3          0.2        0
3             4.6          3.1           1.5          0.2        0
4             5.0          3.6           1.4          0.2        0
..            ...          ...           ...          ...      ...
145           6.7          3.0           5.2          2.3        2
146           6.3          2.5           5.0          1.9        2
147           6.5          3.0           5.2          2.0        2
148           6.2          3.4           5.4          2.3        2
149           5.9          3.0           5.1          1.8        2

[150 rows x 5 columns]

可以看到有4列为特征,最后一列为类别

这里为了画图方便仅使用了Sepal_Length  和Petal_Width  两列

 可以看到特征和结果相关性挺高的

假如没有标签,看起来可以用kmeans解决,最后用kmeans看能不能得到类似的一个结果

# -*- coding: utf-8 -*-
import glob
from collections import defaultdict
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np



def plot_scatter(df, name, centers=None, title=None):
    '''
    画图
    '''
    plt.figure()
    plt.scatter(df['Sepal_Length'], df['Petal_Width'], c=df['Species'])
    plt.xlabel('Sepal_Length')
    plt.ylabel('Petal_Width')
    plt.legend()
    if centers:
        plt.scatter([i[0] for i in centers], [i[1] for i in centers], c='r')
    if title:
        plt.title(title)
    plt.savefig(name)


def distance(point_a, point_b):
    '''
    欧氏距离计算
    '''
    return np.sqrt(sum((np.array(point_a) - np.array(point_b)) ** 2))


def k_means(points, k):
    centers = [points[i] for i in range(k)]
    dict_ = []
    iter_num = 0
    while True:
        point_dict = defaultdict(list)
        for point in points:
            distances = [distance(center, point) for center in centers]
            class_ = np.argmin(distances)
            dict_.append({'Sepal_Length': point[0], 'Petal_Width': point[1], 'Species': class_}, )
            point_dict[class_].append(point)
        print({k: len(v) for k, v in point_dict.items()})
        new_centers = [np.array(points).mean(axis=0) for class_, points in point_dict.items()]
        dis = (np.array(new_centers) - centers)
        if abs(dis.mean()) <= 0.0002:
            break
        else:
            centers = new_centers
            plot_scatter(pd.DataFrame(dict_), f'kmeans_{iter_num}.png', centers, iter_num)
            iter_num += 1


def png2jif():
    '''
    迭代生成的png转为动图
    '''
    file_names = glob.glob('*.png')
    from PIL import Image
    im = Image.open(file_names[0])
    images = []
    for file_name in file_names[1:]:
        images.append(Image.open(file_name))
    im.save('gif.gif', save_all=True, append_images=images, loop=1, duration=500, comment=b"aaabb")


def get_iris_df():
    iris = load_iris()
    iris_d = pd.DataFrame(iris['data'], columns=['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
    iris_d['Species'] = iris.target
    iris_d.dropna(inplace=True)
    return iris_d

if __name__ == '__main__':
    iris_df = get_iris_df()
    plot_scatter(iris_df, 'raw.png')
    print(iris_df)
    points = iris_df[['Sepal_Length', 'Petal_Width']].values
    k = 3
    k_means(points, k)
    png2jif()

 

 红色为中心点,可以看到通过kmeans可以得到一个和原始结果相近的一个结果

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: K-means聚类算法是一种无监督学习算法,常用于数据聚类分析。Python中可以使用scikit-learn库实现K-means聚类算法。下面是使用Python实现鸢尾花数据集的K-means聚类算法的示例代码: ```python from sklearn.cluster import KMeans from sklearn.datasets import load_iris # 加载鸢尾花数据iris = load_iris() X = iris.data # 构建K-means模型 kmeans = KMeans(n_clusters=3, random_state=0) # 训练模型 kmeans.fit(X) # 输出聚类结果 print(kmeans.labels_) ``` 以上代码中,首先使用`load_iris()`函数加载鸢尾花数据集,然后使用`KMeans()`函数构建K-means模型,指定聚类数为3。接着使用`fit()`函数训练模型,并使用`labels_`属性输出聚类结果。 注意:以上代码仅为示例,实际应用中需要根据具体情况进行参数调整和模型优化。 ### 回答2: kmeans聚类算法是机器学习中经典的算法之一,其原理是将数据集进行划分,划分成不同的类别,每个类别中的数据点都具有相似的特征。在kmeans算法中,我们需要给定k个聚类中心,然后根据数据与聚类中心的距离,将其分配到相应的聚类中心所代表的类别中。算法会不断迭代更新聚类中心,直至聚类中心不发生变化或达到最大迭代次数为止。本文将介绍如何使用Python实现kmeans算法,并以鸢尾花数据集为例进行演示。 鸢尾花数据集是一个经典的分类问题,由R.A. Fisher在1936年介绍,包含了三类不同种类的鸢尾花:Iris setosa、Iris virginica、Iris versicolor。每种鸢尾花的萼片长度、萼片宽度、花瓣长度、花瓣宽度都被测量,因此可以通过这些特征来进行分类。 我们使用Python中的Scikit-learn库来实现kmeans算法,并对鸢尾花数据集进行聚类,操作步骤如下: 1. 导入所需的库,包括numpy,pandas和sklearn.cluster。 ```python import numpy as np import pandas as pd from sklearn.cluster import KMeans ``` 2. 加载数据集,可以从Scikit-learn库中直接加载鸢尾花数据iris。我们将其存储为一个数据框,并查看前几行数据。 ```python from sklearn.datasets import load_iris iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df.head() ``` 3. 根据kmeans算法,我们需要为数据集指定k值。在这个例子中,我们将k值设为3,以便与鸢尾花的三个类别对应。 ```python kmeans = KMeans(n_clusters=3) ``` 4. 将数据集传递给kmeans算法进行拟合。 ```python kmeans.fit(df) ``` 5. 输出聚类中心的坐标。 ```python kmeans.cluster_centers_ ``` 6. 输出每个数据点所属的类别。 ```python kmeans.labels_ ``` 通过以上步骤,我们成功地使用Python实现kmeans算法,并对鸢尾花数据集进行了聚类。通过输出每个数据点所属的类别,我们可以看到算法的分类结果。由于数据集已经被正确地标记为三个不同的类别,所以我们可以将算法得出的结果和真实结果进行比较。 在这个例子中,我们只使用了一种聚类算法,并且只针对鸢尾花数据集进行了演示。在实际应用中,我们需要根据数据集的特点选择不同的聚类算法,并根据问题来确定最合适的k值。 ### 回答3: Kmeans聚类算法是一种常见的无监督学习算法,在对未标注数据进行分类、群体分析、数据降维等方面具有广泛应用。这个算法实现需要指定数据类别的个数,以及用于衡量每个数据点离其所属类别中心点的距离,通常采用欧式距离或余弦距离。在本次任务中,我们将介绍如何使用Python实现Kmeans聚类算法对鸢尾花数据集进行分类。 鸢尾花数据集是一个常用的分类和聚类算法数据集,包括三种鸢尾花:Setosa、Versicolour和Virginica,每种花分别有50个样本,总共有150个样本。每个样本记录有四个特征变量:花萼长度、花萼宽度、花瓣长度和花瓣宽度,我们可以使用这四个变量用于聚类分析。以下是实现Kmeans聚类算法的步骤: 1. 计算距离:使用欧式距离计算每个样本和指定类别中心点的距离。 2. 初始化类别中心点:随机初始化每组类别的中心点。 3. 执行聚类:将每个样本分配到距离最近的中心点组中。 4. 重新计算类别中心点:重新计算每组聚类的中心点。 5. 重复步骤3和4,直到类别中心点不再移动。 现在,我们使用Python语言根据以上步骤实现Kmeans聚类算法: import numpy as np from sklearn import datasets # 加载鸢尾花数据iris = datasets.load_iris() X = iris.data y = iris.target # 指定聚类数为3,随机初始化每个类别的中心点 K = 3 C = np.random.rand(K, X.shape[1]) # 定义两个向量之间的欧式距离 def distance(x1, x2): return np.sqrt(np.sum((x1 - x2)**2)) # 聚类 def kmeans(X, C): # 记录每个样本的所属类别 clusters = np.zeros(len(X)) # 初始化距离无限大 distance_to_centroid = np.ones(len(X)) * np.inf # 迭代至中心点不再移动 while True: for i, x in enumerate(X): # 计算距离 distances = [distance(x, c) for c in C] # 选取距离最近的类别 cluster = np.argmin(distances) # 更新聚类 clusters[i] = cluster distance_to_centroid[i] = distances[cluster] # 重新计算中心点 new_C = np.array([X[clusters == k].mean(axis=0) for k in range(K)]) # 最终停止条件 if np.allclose(new_C, C): break C = new_C return clusters # 运行聚类算法 clusters = kmeans(X, C) # 打印聚类结果 print(clusters) 输出结果为每个样本所属的类别:0、1、2。 通过以上实现,我们可以使用Python轻松地实现Kmeans聚类算法对鸢尾花数据集进行分类。当然,对于更复杂的数据集,Kmeans聚类算法依旧是一个优秀的无监督学习算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值