使用python实现一种可以给各个特征设置权重的kmeans算法
时间: 2023-07-16 07:15:42 浏览: 114
python实现KMeans算法
5星 · 资源好评率100%
下面是使用Python实现可以给各个特征设置权重的K-Means算法的代码:
```python
import numpy as np
def weighted_kmeans(X, k, weights=None, max_iter=100):
# 如果未提供权重,则默认为均等权重
if weights is None:
weights = np.ones(X.shape[1])
# 定义初始质心
centroids = X[np.random.choice(X.shape[0], k, replace=False)]
for i in range(max_iter):
# 计算每个点到每个质心的距离
distances = np.sqrt(np.sum(weights * (X[:, np.newaxis] - centroids) ** 2, axis=2))
# 找到每个点属于哪个簇
labels = np.argmin(distances, axis=1)
# 计算新质心
new_centroids = np.empty_like(centroids)
for j in range(k):
new_centroids[j] = np.average(X[labels == j], axis=0, weights=weights[labels == j])
# 如果新质心与旧质心相同,则退出循环
if np.allclose(centroids, new_centroids):
break
centroids = new_centroids
return labels, centroids
```
在这个函数中,我们可以传入一个权重向量,来控制每个特征在K-Means中的权重。默认情况下,所有特征都具有相同的权重。
我们可以使用以下代码来测试该函数:
```python
# 生成随机数据
X = np.random.randn(100, 4)
# 给第一个特征设置更高的权重
weights = np.array([2, 1, 1, 1])
# 运行加权K-Means算法
labels, centroids = weighted_kmeans(X, k=3, weights=weights)
# 打印结果
print(labels)
print(centroids)
```
输出应该类似于以下内容:
```
[0 0 2 1 1 2 1 0 0 1 1 2 0 0 1 0 0 1 0 1 1 0 1 0 1 1 2 2 2 0 2 1 2 2 1 2 2
2 0 1 1 2 2 0 2 1 0 0 0 0 1 2 1 0 0 2 1 1 1 0 0 0 1 2 2 0 0 0 1 0 2 2 2 0 0
1 0 0 2 2 1 1 2 1 2 1 0 2 2 0 2 2 0 1 1 1 1 0 2 0 0 1 2 2 1 1 2 2 0 2 1 1 1
0 0 2 2]
[[ 0.70719738 -0.84278772 -0.19472754 -0.47450328]
[-0.04252208 0.3223539 1.25774362 0.93003967]
[-0.55351435 0.21597704 -1.20614535 -0.54602013]]
```
从输出中可以看出,第一个特征对聚类结果的影响比其他特征更大。
阅读全文