<h3>回答1:</h3><br/>以下是使用Python编写的K-means算法数据挖掘第十章习题的代码:
```
import numpy as np
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
%matplotlib inline
# 生成随机数据
num_points = 200
num_clusters = 4
x, y = [], []
for i in range(num_points):
if np.random.random() > 0.5:
x.append(np.random.normal(0.0, 0.9))
y.append(np.random.normal(0.0, 0.9))
else:
x.append(np.random.normal(3.0, 0.5))
y.append(np.random.normal(1.0, 0.5))
data = np.column_stack((x, y))
# 执行k-means算法
kmeans = KMeans(n_clusters=num_clusters, init='k-means++', max_iter=100, n_init=1, verbose=0)
kmeans.fit(data)
# 绘制聚类结果
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k']
for i in range(num_points):
plt.scatter(data[i, 0], data[i, 1], s=30, color=colors[kmeans.labels_[i]])
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='k')
plt.show()
```
该代码用于生成随机数据,并执行K-means算法进行聚类。最终绘制聚类结果,并以黑色十字形显示聚类中心点。可以通过修改随机数据的生成方式、聚类数目、算法参数等,来测试不同的聚类效果。
<h3>回答2:</h3><br/>K-means算法是一种常用的基于聚类的数据挖掘算法,可以对无标签数据进行聚类分析,本章中介绍了K-means算法的原理及其python代码实现。代码如下:
``` python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成数据集
def create_datset(k, n):
data = []
for i in range(k):
init_center = np.random.randint(0, 30, size=2)
x = np.random.normal(init_center[0], 1, size=(n, 2))
data.append(x)
return np.vstack(data)
# 计算欧氏距离
def distance(x, center):
diffs = x - center
return np.sqrt(np.sum(diffs ** 2, axis=1))
# k-means算法
def k_means(data, k, max_iter=100):
# 随机初始化k个中心点
centers = data[np.random.choice(data.shape[0], k, replace=False)]
for i in range(max_iter):
# 计算每个样本距离最近的中心点
labels = np.argmin([distance(data, center) for center in centers], axis=0)
# 更新中心点位置
new_centers = [data[labels == j].mean(axis=0) for j in range(k)]
# 判断聚类是否已经收敛,如果已经收敛则退出循环
if np.all(centers == new_centers):
break
centers = new_centers
return centers, labels
# 显示聚类结果
def plot_clusters(data, labels, centers):
plt.scatter(data[:, 0], data[:, 1], c=labels, s=50, alpha=0.5)
plt.scatter(centers[:, 0], centers[:, 1], marker='*', c='r', s=100, alpha=0.5)
plt.show()
if __name__ == '__main__':
data = create_datset(k=3, n=100)
centers, labels = k_means(data, k=3)
plot_clusters(data, labels, centers)
```
代码中首先生成了一个带有3个簇的数据集,然后通过k_means()函数实现了K-means算法的聚类过程,最后使用plot_clusters()函数将聚类结果可视化展示了出来。
K-means算法的python实现代码较为简单,但需要注意一些细节问题。例如,在实现距离计算时,我们可以使用numpy中的sum()函数,但此时需要指定axis参数,否则无法正确计算每个样本距离每个中心点的距离;在更新中心点位置时,需要注意对样本进行筛选以避免无效计算;同时,在K-means算法的循环过程中,需要判断聚类是否已经收敛,并根据需要设置收敛的迭代次数。
<h3>回答3:</h3><br/>k-means算法是一种常用的聚类算法,在数据挖掘中得到广泛应用。它的原理简单,是一种迭代算法,不断将数据点分配到离它最近的中心点所在的簇,然后重新计算每个簇的中心点,直到满足停止条件为止。以下是k-means算法的python代码。
首先,需要导入必要的库和数据集。常用的数据集有iris、wine、digits等。在这里以iris数据集为例。代码如下:
```python
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
iris = load_iris()
X = iris.data
```
确定簇的个数k,本例中将k设为3。
```python
k = 3
```
实例化k-means算法模型,并设置参数。n_clusters为簇的个数,init表示初始化的方法,k-means++为默认值,max_iter表示最大的迭代次数,n_init为选取不同的初始化方式运行k-means算法的次数,verbose表示是否输出冗长的进度信息。
```python
kmeans = KMeans(n_clusters=k,
init='k-means++',
max_iter=100,
n_init=10,
verbose=0)
```
训练模型并进行预测。
```python
pred = kmeans.fit_predict(X)
```
最后,可视化聚类结果。
```python
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 以三个特征为坐标轴画图
fig = plt.figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=pred,
cmap=plt.cm.Set1, edgecolor='k', s=40)
ax.set_title("iris 3D clustering")
ax.set_xlabel("feature 1")
ax.w_xaxis.set_ticklabels([])
ax.set_ylabel("feature 2")
ax.w_yaxis.set_ticklabels([])
ax.set_zlabel("feature 3")
ax.w_zaxis.set_ticklabels([])
plt.show()
```
以上是k-means算法的python代码,在实际应用中,可以根据数据集的特点选择合适的簇数和参数,得到更好的聚类效果。