Kmeans_鸢尾花聚类

33 篇文章 0 订阅
24 篇文章 0 订阅

手写

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
def distance(vex1,vex2):
    return np.sqrt(np.sum(np.power(vex1-vex2,2)))
def kMeans_way(S,k,distMeas=distance):
    m=np.shape(S)[0]
    
    sampleTag = np.zeros(m)
    n=np.shape(S)[1]
    print (m,n)
    clusterCenter = np.mat(np.zeros((k,n)))
    for j in range(n):
        minJ=min(S[:,j])
        maxJ=max(S[:,j])
        rangeJ=float(maxJ-minJ)
        clusterCenter[:,j]=np.mat(minJ + rangeJ*np.random.rand(k,1))
    #print (clusterCenter)
    
    sampleTagChanged = True
    SSE = 0.0
    while sampleTagChanged:
        sampleTagChanged = False
        SSE = 0.0
        for i in range(m):
            minD = np.inf
            minIndex = -1
            for j in range(k):
                d=distMeas(clusterCenter[j,:],S[i,:])
                if d<minD:
                    minD=d
                    minIndex=j
            if sampleTag[i]!=minIndex:
                sampleTagChanged = True
            sampleTag[i] = minIndex
            SSE+=minD**2
        print (SSE)
        for i in range(k):

            ClustI=S[np.nonzero(sampleTag[:]==i)[0]]
            clusterCenter[i,:]= np.mean(ClustI,axis=0)
            
    return clusterCenter,sampleTag,SSE         
def draw_pic(samples,sampleTag,clusterCenter):
    k=len(clusterCenter)
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    markers=['sg','py','ob','pr']
   
    for i in range(k):
        data_pos = samples[sampleTag== i]
        plt.plot(data_pos[:,0].tolist(),data_pos[:,1].tolist(),markers[i])

    plt.plot(clusterCenter[:,0].tolist(),clusterCenter[:,1].tolist(),"r*",markersize=20)

    plt.title('鸢尾花')
    plt.show()
    
def main():
    k=3
    print ("----------ing-------------")
    iris_data = load_iris()
    data= iris_data.data[:]
    clusterCenter,sampleTag,SSE = kMeans_way(data,k)
    if np.isnan(clusterCenter).any():
        print ("Error!reson:质心重叠!")
        return
    print (type(sampleTag))
    draw_pic(data,sampleTag,clusterCenter)
    print ("----------end-------------")

main()

在这里插入图片描述

调用sklearn

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans

def draw_pic(data,centers,result):
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    markers=['sg','py','ob','pk']
    for i,d in enumerate(data):
        plt.plot(d[0],d[1],markers[result[i]])

    for i,center in enumerate(centers):
        plt.plot(center[0],center[1],"r*",markersize=20)
    plt.title('鸢尾花')
    plt.show()
    
def main():
    k=4
    print ("----------ing-------------")
    iris_data = load_iris()
    data= iris_data.data[:]
    model = KMeans(n_clusters=k)
    model.fit(data)
    clusterCenter = model.cluster_centers_
    if np.isnan(clusterCenter).any():
        print ("Error!reson:质心重叠!")
        return
    result = model.predict(data)
    print("result:",result)
    print("model_labels:",model.labels_)
    draw_pic(data,clusterCenter,result)
    print ("----------end-------------")

main()

在这里插入图片描述

思路,随机生成聚类中心。
然后,比较样本点到距离聚类中心的距离大小,距离哪个样本点近就属于哪个聚类。
随之,画出样本点及聚类中心。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python可以使用scikit-learn库来实现kmeans聚类鸢尾花。以下是一个简单的代码示例: ```python from sklearn.cluster import KMeans from sklearn.datasets import load_iris # 加载鸢尾花数据集 iris = load_iris() # 创建KMeans模型并拟合数据 kmeans = KMeans(n_clusters=3) kmeans.fit(iris.data) # 输出聚类结果 print(kmeans.labels_) ``` 在这个例子中,我们使用了scikit-learn库中的KMeans类来创建一个KMeans模型,并使用鸢尾花数据集进行拟合。我们将聚类数目设置为3,因为鸢尾花数据集中有3种不同的鸢尾花。最后,我们输出了聚类结果,即每个样本所属的聚类标签。 ### 回答2: K-means聚类是最常见的聚类算法之一,其主要思想是将数据集分成K个簇,使得簇内部数据点的相似度高于簇间数据点的相似度,达到最小化目标函数的效果。在这篇文章中,我们将使用Python实现K-means聚类算法,以聚类鸢尾花数据集为例。 步骤1:导入库 首先,我们需要导入一些必要的库包,包括numpy、pandas、matplotlib以及sklearn。 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeans 步骤2:读取数据集 在此步骤中,我们需要使用pandas库读取鸢尾花数据集。鸢尾花数据集包含150个样本,其中每个样本包含4个特征(sepal length, sepal width, petal length, petal width)。我们将其保存在名为“iris”的DataFrame中,并展示前5个样本。 iris = pd.read_csv('iris.csv') print(iris.head()) 步骤3:计算簇的数量 K-means算法中最重要的一个参数就是簇的数量,也就是K的值。在此步骤中,我们将使用手肘法来确定K的值。手肘法会计算每个点到其所属簇的质心的距离平方和(SSE),并将其绘制成一个折线图,我们会选择其中一个拐点作为K的值。我们可以使用以下代码实现。 sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, max_iter=1000) kmeans.fit(iris.iloc[:, 0:4]) sse.append(kmeans.inertia_) plt.plot(range(1, 11), sse) plt.title('Elbow Method') plt.xlabel('Number of clusters') plt.ylabel('SSE') plt.show() 根据上图,我们可以看到在K=3时出现了“手肘”,这意味着我们应该选择K=3。 步骤4:聚类 现在我们已经确定了簇的数量为3,使用sklearn中的KMeans类我们可以实现K-means聚类。以下代码演示了如何训练模型并预测簇标签。 kmeans = KMeans(n_clusters=3, max_iter=1000) kmeans.fit(iris.iloc[:, 0:4]) pred_cluster = kmeans.predict(iris.iloc[:, 0:4]) iris['Cluster'] = pred_cluster print(iris.head()) 步骤5:可视化结果 我们可以使用matplotlib包来可视化聚类结果。在此处,我们按照原始数据集中每个样本的两个特征(sepal length和petal length)绘制了K-means聚类后得到的簇。通过不同的颜色来表示不同的簇。以下是可视化结果的代码: plt.scatter(iris.loc[iris['Cluster']==0, 'sepal length'], iris.loc[iris['Cluster']==0, 'petal length'], c='red', label='Cluster 0') plt.scatter(iris.loc[iris['Cluster']==1, 'sepal length'], iris.loc[iris['Cluster']==1, 'petal length'], c='blue', label='Cluster 1') plt.scatter(iris.loc[iris['Cluster']==2, 'sepal length'], iris.loc[iris['Cluster']==2, 'petal length'], c='green', label='Cluster 2') plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 2], c='black', marker='*', label='Centroids') plt.title('K-means Clustering') plt.xlabel('sepal length') plt.ylabel('petal length') plt.legend() plt.show() 我们可以看到,聚类结果大致可分为三类,其中每一类被不同的颜色所代表,而模型找到的质心用星号表示,每个类别与其所属质心之间的距离均较小。 ### 回答3: 鸢尾花数据集是一个经典的模式识别数据集,由三种不同品种的鸢尾花(Setosa、Versicolor、Virginica)组成,每个品种有50个样本,鸢尾花数据集一共包含了150个样本。kmeans聚类是一种无监督的学习算法,它将数据集划分为k个不同的簇,每个簇内的样本相似性高,而不同簇之间的相似性较小。在本文中,我们将使用Python编程语言实现kmeans聚类算法,对鸢尾花数据集进行聚类。 首先,我们需要导入所需的Python库: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import load_iris ``` 接下来,我们加载鸢尾花数据集并转换为pandas数据框: ```python iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) ``` 然后,我们使用KMeans算法进行聚类: ```python kmeans = KMeans(n_clusters=3, random_state=0) kmeans.fit(df) ``` 这里我们将鸢尾花数据集分为3个簇,随机选择初始中心点。 最后,我们可以将结果可视化: ```python plt.figure(figsize=(10, 7)) plt.scatter(df['sepal length (cm)'], df['petal length (cm)'], c=kmeans.labels_) plt.xlabel('Sepal Length (cm)') plt.ylabel('Petal Length (cm)') plt.show() ``` 最终的结果如下图所示: ![image-20210618141801423](https://cdn.jsdelivr.net/gh/17955362230/PicBed/images/202106181418061.png) 我们可以看到,使用kmeans聚类算法的结果非常好,它能够将数据集的三个品种分为不同的簇。这对于进一步的数据分析和模型训练非常有帮助。 总之,Python是一种非常强大和灵活的编程语言,可以用于实现各种机器学习算法。在本文中,我们演示了如何使用Python实现kmeans聚类算法并应用于鸢尾花数据集。如果您还需要了解更多关于机器学习和Python编程的知识,请继续关注我们的文章。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佐倉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值