机器学习 K均值聚类(K-means) 鸢尾花数据集

聚类的目标是使聚类后的各个簇,具有簇内聚合,簇间分离的特点。

如何度量簇之间,簇内样本之间的差异度?常用距离计算,最常用的是“闵可夫斯基距离”(Minkowski distance),其与向量范数相对应。

K均值算法的优化目标是最大化:簇内样本围绕簇均值向量的紧密程度

即最大化簇内样本的相似度

簇均值向量的定义如下:

设总样本集D=\left \{ x_{1},x_{2},\cdots ,x_{m} \right \},划分为k个簇为C=\left \{ C_{1},C_{2},\cdots ,C_{k} \right \},则簇C_{i}的均值向量定义如下

                                                                                       \mu _{i}=\frac{1}{\left | c_{i} \right |}\sum_{x\in C_{i}}x

为了求得最优解,需要考察样本的所有划分,这是一个NP难问题,K均值算法采用贪心策略迭代的求出近似的最优解。

算法流程如下:

随机在样本集中找k个样本作为初始的簇均值向量,k个样本代表划分为k个簇

k = 4
import random
a = range(n)
b = random.sample(a, k)

 变量b以列表形式记录了k个随机数,提取k个样本作为初始的簇均值向量,并将数据形式从pandas.DataFrame转换为numpy.array,以便后续计算

U = []
for i in b:
    U.append(np.array(data.loc[i].loc[[0, 1, 2, 3]]))

k个初始簇均值向量如下:

[array([5.8, 2.7, 5.1, 1.9], dtype=object),
 array([4.9, 3.1, 1.5, 0.1], dtype=object),
 array([4.4, 3.2, 1.3, 0.2], dtype=object),
 array([5.2, 2.7, 3.9, 1.4], dtype=object)]

分别计算各个样本数据与这k个簇均值向量的差异(距离),将这个样本划分到距离最近的那个簇

C = [[] for _ in range(k)]#存储簇划分
dist = [0 for _ in range(k)]#存储距离
for i in range(n):
    x = np.array(data.loc[i].loc[[0, 1, 2, 3]])
    for j in range(k):
        d = sum((x - U[j]) ** 2)
        dist[j] = d
    z = dist.index(min(dist))
    C[z].append(data.loc[i])

 重新计算各个簇的均值向量,重新计算各个样本与各个簇均值向量之间的差异(距离),重新划分样本数据,得到新的簇划分,

重复这个过程,直到簇划分逐渐趋于稳定,从而得到近似的最优簇划分。

U_new = [0 for _ in range(k)]
for i in range(k):
    sumn = [0 for _ in range(4)]
    for j in C[i]:
        sumn = sumn + np.array(j.loc[[0, 1, 2, 3]])
    sumn = sumn / len(C[i])
    U_new[i] = sumn
U_new
for _ in range(100):
    U = U_new
    C = [[] for _ in range(k)]
    dist = [0 for _ in range(k)]
    for i in range(n):
        x = np.array(data.loc[i].loc[[0, 1, 2, 3]])
        for j in range(k):
            d = sum((x - U[j]) ** 2)
            dist[j] = d
        z = dist.index(min(dist))
        C[z].append(data.loc[i])
    U_new = [0 for _ in range(k)]
    for i in range(k):
        sumn = np.array([0 for _ in range(4)])
        for j in C[i]:
            sumn = sumn + np.array(j.loc[[0, 1, 2, 3]])
        sumn = sumn / len(C[i])
        U_new[i] = sumn

 在这里我没有设置迭代的终止条件,而是直接做了100次迭代,我们来看一下,最终划分的结果:

C0 = pd.DataFrame(C[0])
C0[4].value_counts()
Iris-virginica     36
Iris-versicolor     3
Name: 4, dtype: int64

第一个簇中,39个样本,36个是virginica,3个是versicolor,簇的纯度是比较高的,这符合我们对聚类结果的期望,用同样的方法,看看其他簇的样本分布:

C1 = pd.DataFrame(C[1])
C1[4].value_counts()

C2 = pd.DataFrame(C[2])
C2[4].value_counts()

C3 = pd.DataFrame(C[3])
C3[4].value_counts()
Iris-setosa    27
Name: 4, dtype: int64

Iris-setosa    23
Name: 4, dtype: int64

Iris-versicolor    47
Iris-virginica     14
Name: 4, dtype: int64

 可以看到setosa类鸢尾花的划分是效果最好的,其他两类有划分交集,但是结果是可以接受的

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: K-Means 聚类算法是一种常用的无监督学习算法,它可以将数据集划分为 K 个不同的类别,其中 K 是预先设定的。在 K-Means 算法中,我们需要指定 K 值和距离计算方法,然后通过迭代的方式不断调整聚类中心,直到达到某个停止准则为止。 下面我们以鸢尾花数据集为例,来实现 K-Means 聚类算法。 首先,我们需要导入数据集并进行预处理。这里我们使用 sklearn 中的 load_iris 函数来加载数据集,并使用 MinMaxScaler 对数据进行归一化处理: ``` python from sklearn.datasets import load_iris from sklearn.preprocessing import MinMaxScaler # 加载数据集 iris = load_iris() X = iris.data # 数据归一化 scaler = MinMaxScaler() X = scaler.fit_transform(X) ``` 接下来,我们需要实现 K-Means 算法。这里我们使用 scikit-learn 中的 KMeans 类来实现: ``` python from sklearn.cluster import KMeans # 设置 K 值 k = 3 # 初始化 KMeans 模型 kmeans = KMeans(n_clusters=k) # 训练模型并预测结果 y_pred = kmeans.fit_predict(X) ``` 最后,我们可以使用 Matplotlib 来可视化聚类结果: ``` python import matplotlib.pyplot as plt # 绘制聚类结果 plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.title("K-Means Clustering") plt.show() ``` 运行以上代码,即可得到鸢尾花数据的聚类结果。 ### 回答2: K-Means聚类算法是一种常用的无监督学习方法,能够对数据进行聚类。在K-Means算法中,通过计算数据点与聚类中心的距离,将数据点归类到距离最近的聚类中心,从而实现数据的聚类。 鸢尾花数据是机器学习中常用的数据集之一,包含了150个样本,每个样本有4个特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。这些样本被分为三个类别,分别是山鸢尾、变色鸢尾和维吉尼亚鸢尾。 使用K-Means聚类算法对鸢尾花数据进行聚类的过程如下: 1. 随机选择K个初始聚类中心。K代表要将数据聚成的类别数,这里我们选择K=3,即将鸢尾花数据聚成3个类别。 2. 对每个数据点,计算其与各个聚类中心的距离,并将其归类到距离最近的聚类中心。 3. 更新每个聚类中心的位置,将其移动到所归类数据点的平均位置。 4. 重复步骤2和3,直到聚类中心不再发生变化或达到预定的迭代次数。 通过上述步骤,可以将鸢尾花数据聚类成3个类别。每个类别中的数据点具有相似的特征,并且与其他类别中的数据点的特征有较大的区别。 K-Means聚类算法的优点是简单易实现,计算效率高。然而,这种算法对初始聚类中心的选择较为敏感,可能会收敛到局部最优解。因此,在应用K-Means算法时,需要进行多次实验,以避免得到不理想的聚类结果。同时,K-Means算法对于离群点比较敏感,离群点可能会影响聚类结果的准确性。 ### 回答3: K-Means 聚类算法是一种常用的无监督学习算法,主要用于将数据集中的样本划分成不同的。下面以实现鸢尾花数据的聚类为例进行解释。 首先,我们需要加载鸢尾花数据集,该数据集包含了150个样本,每个样本有4个特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。我们将这些样本表示为一个150x4的矩阵。 然后,我们需要确定的数量 k,即要将数据集划分成几个。在这里,我们可以根据经验或者领域知识来选择一个合适的值。 接下来,我们需要初始化 k 个的中心点。可以随机从数据集中选取 k 个样本作为初始的中心点。 然后,对于每个样本,我们计算其与各个中心点的距离,并将其分配给距离最近的中心点所在的。 接着,我们更新每个的中心点,即将每个中的样本的特征均值作为新的中心点。 最后,我们重复执行以上两个步骤,直到中心点不再发生变化,或者到达预定的迭代次数。 完成聚类后,我们可以根据的中心点和每个样本所属的来进行结果的分析和可视化。例如,可以绘制不同中心点的特征值分布图,以及将样本点按的标签进行颜色分类的散点图等。 K-Means 聚类算法能够有效地将数据集划分为不同的,实现了对样本的聚类。在鸢尾花数据集这个例子中,我们可以根据花萼和花瓣的特征值将鸢尾花分为不同的类别,从而更好地了解这些花的分类情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫猫虫(——)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值