K-means聚类算法实例
时间: 2023-03-13 16:08:24 浏览: 89
K-means聚类算法是一种常用的聚类分析算法,它根据数据对象之间的相似度将对象分到不同的簇中,以实现数据分类的目的。例如,可以使用K-means算法将用户数据分组成不同的用户群体,以便了解不同类别用户的行为特征。
相关问题
k-means聚类算法实例
k-means是一种常见的聚类算法,它将数据分成k个簇,每个簇内的数据点相似度较高,而不同簇之间的相似度较低。它的基本思想是:将数据点分成k个簇,使得每个簇内的点与该簇内所有点的距离之和最小。
下面是一个简单的k-means聚类算法的实例:
1. 首先,随机选择k个数据点作为初始簇中心点。
2. 对于每个数据点,计算其与每个簇中心点之间的距离,并将其分配到距离最近的簇中。
3. 对于每个簇,重新计算该簇的中心点,即将该簇中所有数据点的坐标取平均值作为新的中心点。
4. 重复步骤2和步骤3,直到簇中心点不再发生变化或达到最大迭代次数。
下面是Python代码实现一个简单的k-means聚类算法:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 随机生成数据
data = pd.DataFrame(np.random.randn(100, 2))
# 设置簇数K
K = 3
# 随机选择K个数据点作为初始簇中心点
centroids = data.sample(n=K)
# 初始化簇分配结果
clusters = pd.Series(np.zeros(len(data)))
# 设置最大迭代次数
max_iter = 10
# 迭代计算
for i in range(max_iter):
# 对于每个数据点,计算其与每个簇中心点之间的距离,并将其分配到距离最近的簇中
for j in range(len(data)):
distances = [np.linalg.norm(data.iloc[j] - centroids[k]) for k in range(K)]
cluster = np.argmin(distances)
clusters[j] = cluster
# 对于每个簇,重新计算该簇的中心点
for k in range(K):
centroids.iloc[k] = data[clusters == k].mean()
# 可视化结果
colors = ['red', 'green', 'blue']
for k in range(K):
plt.scatter(data[clusters == k][0], data[clusters == k][1], c=colors[k])
plt.scatter(centroids[0], centroids[1], c='black', marker='x')
plt.show()
```
这段代码首先随机生成了100个二维数据点,然后随机选择3个数据点作为初始簇中心点。接着,它通过迭代计算不断更新簇分配结果和簇中心点,直到簇中心点不再发生变化或达到最大迭代次数。最后,它将结果可视化出来。
运行结果可能会每次都不同,但一般情况下,我们会得到三个不同颜色的簇中心点和对应的数据点。
在农业方面相关的k-means聚类算法实例
K-means聚类算法可以在农业领域中应用,例如对农作物数据进行聚类分析,以便农业工作者更好地了解不同作物之间的差异和相似性。以下是一个简单的k-means聚类算法实例:
假设我们有一个数据集,其中包含一些农作物的特征,如下表所示:
| 作物 | 产量(吨/公顷) | 需水量(升/公顷) | 耕作时间(天) |
|------|---------------------|---------------------|---------------------|
| 小麦 | 3.5 | 500 | 120 |
| 玉米 | 6.2 | 800 | 150 |
| 大豆 | 2.8 | 400 | 90 |
| 水稻 | 4.1 | 700 | 130 |
| 小麦 | 3.9 | 600 | 100 |
| 玉米 | 5.4 | 750 | 140 |
| 大豆 | 2.6 | 350 | 80 |
| 水稻 | 4.7 | 800 | 150 |
我们想要将这些农作物分成几个簇,以了解它们之间的相似性。我们可以使用k-means聚类算法来完成这项任务。
1. 首先,我们需要选择要分成的簇的数量k。在这个例子中,我们将选择k=3。
2. 接下来,我们需要初始化簇心。我们可以随机选择k个数据点作为簇心,或者根据某些启发式方法选择簇心。在这个例子中,我们随机选择3个数据点作为簇心,如下所示:
| 作物 | 产量(吨/公顷) | 需水量(升/公顷) | 耕作时间(天) | 簇 |
|------|---------------------|---------------------|---------------------|----|
| 小麦 | 3.5 | 500 | 120 | |
| 玉米 | 6.2 | 800 | 150 | |
| 大豆 | 2.8 | 400 | 90 | |
| 水稻 | 4.1 | 700 | 130 | |
| 小麦 | 3.9 | 600 | 100 | |
| 玉米 | 5.4 | 750 | 140 | |
| 大豆 | 2.6 | 350 | 80 | |
| 水稻 | 4.7 | 800 | 150 | |
| 小麦 | 3.5 | 500 | 120 | 1 |
| 玉米 | 6.2 | 800 | 150 | 2 |
| 大豆 | 2.8 | 400 | 90 | 3 |
3. 然后,我们需要将每个数据点分配到距离它最近的簇心所在的簇中。我们计算每个数据点与每个簇心之间的距离,并将数据点分配到距离最近的簇中。在这个例子中,我们得到以下结果:
| 作物 | 产量(吨/公顷) | 需水量(升/公顷) | 耕作时间(天) | 簇 |
|------|---------------------|---------------------|---------------------|----|
| 小麦 | 3.5 | 500 | 120 | 1 |
| 玉米 | 6.2 | 800 | 150 | 2 |
| 大豆 | 2.8 | 400 | 90 | 1 |
| 水稻 | 4.1 | 700 | 130 | 2 |
| 小麦 | 3.9 | 600 | 100 | 1 |
| 玉米 | 5.4 | 750 | 140 | 2 |
| 大豆 | 2.6 | 350 | 80 | 1 |
| 水稻 | 4.7 | 800 | 150 | 2 |
4. 接下来,我们需要重新计算每个簇的簇心。对于每个簇,我们计算该簇中所有数据点的平均值,并将该平均值作为新的簇心。在这个例子中,我们得到以下结果:
| 作物 | 产量(吨/公顷) | 需水量(升/公顷) | 耕作时间(天) | 簇 |
|------|---------------------|---------------------|---------------------|----|
| 小麦 | 3.3 | 500 | 106.7 | 1 |
| 玉米 | 5.9 | 766.7 | 143.3 | 2 |
| 大豆 | 2.7 | 383.3 | 83.3 | 1 |
| 水稻 | 4.4 | 733.3 | 140 | 2 |
5. 重复步骤3和4,直到簇心不再改变或达到最大迭代次数为止。在这个例子中,我们得到以下最终结果:
| 作物 | 产量(吨/公顷) | 需水量(升/公顷) | 耕作时间(天) | 簇 |
|------|---------------------|---------------------|---------------------|----|
| 小麦 | 3.3 | 500 | 106.7 | 1 |
| 大豆 | 2.7 | 383.3 | 83.3 | 1 |
| 小麦 | 3.9 | 600 | 100 | 1 |
| 大豆 | 2.6 | 350 | 80 | 1 |
| 水稻 | 4.4 | 733.3 | 140 | 2 |
| 玉米 | 5.9 | 766.7 | 143.3 | 2 |
| 小麦 | 3.5 | 500 | 120 | 1 |
| 玉米 | 6.2 | 800 | 150 | 2 |
这些结果表明,我们的数据集可以分成两个簇:一个由小麦和大豆组成,另一个由水稻和玉米组成。这个结果可以帮助农业工作者了解不同作物之间的相似性和差异性,以便更好地规划农业生产。