# 已知20个点的样本数据: # [[2,5],[4,6],[3,1],[6,4],[7,2],[8,4],[2,3],[3,1],[5,7],[6,9],[12,16],[10,11],[15,19],[16,12],[11,15],[10,14],[19,11],[17,14],[16,11],[13,19]] # 实现k-means算法,完成以下要求: # 实现k=2时,调用库函数并训练模型 # 输出聚类中心的坐标、各点所属聚类中心的位置以及代价 # 画出样本数据及聚类中心的位置 # 实现肘部法则,并画出肘部法则曲线
时间: 2023-08-18 14:32:01 浏览: 65
PPG的样本数据:我之前的代码的PPG样本数据-matlab开发
好的,我来逐一回答您的问题。
首先,关于您提到的样本数据,我将其存储为一个列表:
```
data = [[2,5],[4,6],[3,1],[6,4],[7,2],[8,4],[2,3],[3,1],[5,7],[6,9],[12,16],[10,11],[15,19],[16,12],[11,15],[10,14],[19,11],[17,14],[16,11],[13,19]]
```
接下来,我们来实现k-means算法,完成您的要求。
### 1. 实现k=2时,调用库函数并训练模型
我们可以使用`sklearn`库中的`KMeans`函数来实现k-means算法。代码如下:
```
from sklearn.cluster import KMeans
k = 2
model = KMeans(n_clusters=k).fit(data)
```
### 2. 输出聚类中心的坐标、各点所属聚类中心的位置以及代价
要输出聚类中心的坐标,我们可以使用`model.cluster_centers_`属性;要输出各点所属聚类中心的位置,我们可以使用`model.labels_`属性;要输出代价,则需要计算每个点到其所属聚类中心的距离的平方和。代码如下:
```
import numpy as np
# 聚类中心的坐标
center = model.cluster_centers_
print("聚类中心的坐标:")
print(center)
# 各点所属聚类中心的位置
labels = model.labels_
print("各点所属聚类中心的位置:")
print(labels)
# 计算代价
cost = 0
for i in range(len(data)):
cost += np.linalg.norm(data[i] - center[labels[i]]) ** 2
print("代价:")
print(cost)
```
### 3. 画出样本数据及聚类中心的位置
我们可以使用`matplotlib`库来画出样本数据及聚类中心的位置。代码如下:
```
import matplotlib.pyplot as plt
# 将聚类中心和样本数据分别绘制到图上
plt.scatter(np.array(data)[:,0], np.array(data)[:,1], c=labels)
plt.scatter(center[:,0], center[:,1], marker='*', s=200, c='r')
plt.show()
```
### 4. 实现肘部法则,并画出肘部法则曲线
肘部法则是一种k-means算法中确定最佳k值的方法。其基本思路是随着k值的增加,代价会逐渐减小,但减小的速度会逐渐变缓,而k值对应的代价下降幅度较大的点,就是“肘部”,这个点对应的k值就是最佳的k值。
我们可以将k值从1到10迭代计算代价,然后绘制代价和k值的曲线,找到“肘部”点。代码如下:
```
costs = []
for k in range(1, 11):
model = KMeans(n_clusters=k).fit(data)
cost = 0
for i in range(len(data)):
cost += np.linalg.norm(data[i] - model.cluster_centers_[model.labels_[i]]) ** 2
costs.append(cost)
# 绘制代价和k值的曲线
plt.plot(range(1, 11), costs, '-o')
plt.xlabel('k')
plt.ylabel('cost')
plt.xticks(range(1, 11))
plt.show()
```
经过观察,我们可以发现在k=2时出现了“肘部”,因此最佳的k值就是2。
希望以上内容能够帮到您!
阅读全文