基于不同距离的kmeans算法代码实现
时间: 2024-10-13 07:05:08 浏览: 51
基于不同距离的K-means算法通常指的是有监督学习中的K-means++初始化改进版本,以及使用其他距离度量而非欧氏距离的变种。原始的K-means算法依赖于Euclidean距离(两点间直线距离),但在某些数据集上,例如非正态分布的数据或者特征之间存在异质性的数据,可以考虑使用如Manhattan距离(L1距离)、Mahalanobis距离(考虑了特征间的协方差)等。
以下是使用Python的scikit-learn库中修改过的KMeans示例,这里演示的是如何使用Manhattan距离:
```python
from sklearn.cluster import KMeans
import numpy as np
# 定义 Manhattan 距离
def manhattan_distance(x, y):
return np.abs(x - y).sum(axis=1)
# 创建KMeans实例,指定距离函数
kmeans = KMeans(n_clusters=k, init='k-means++', distance_metric=manhattan_distance)
# 使用数据拟合模型
kmeans.fit(X)
# 预测聚类标签
labels = kmeans.labels_
# 如果需要,还可以获取中心点
centroids = kmeans.cluster_centers_
```
在这个例子中,`distance_metric` 参数指定了使用哪种距离度量,`X` 是输入的样本数据。
相关问题
基于python利用kmeans算法进行聚类分析
K-means是一种基于距离度量的聚类算法,它将数据集分成k个簇。下面是使用Python和scikit-learn库实现K-means聚类的示例代码:
首先,我们需要准备一些数据。这里我们使用sklearn.datasets中的make_blobs函数生成一个随机数据集:
```python
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成随机数据集
X, y = make_blobs(n_samples=100, centers=4, random_state=42)
plt.scatter(X[:, 0], X[:, 1])
plt.show()
```
生成的数据集如下所示:
![kmeans_data](https://cdn.jsdelivr.net/gh/kkkk10000/image-hosting/img/kmeans_data.png)
接下来,我们使用KMeans类来进行聚类。该类需要指定簇的数量(k),并且可以选择不同的初始化方法。这里我们使用默认值。
```python
from sklearn.cluster import KMeans
# 定义K-means模型
kmeans = KMeans(n_clusters=4)
# 训练模型
kmeans.fit(X)
# 预测簇标签
y_pred = kmeans.predict(X)
```
现在我们可以绘制结果了。下面的代码绘制了数据点和簇中心:
```python
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
```
绘制的结果如下所示:
![kmeans_result](https://cdn.jsdelivr.net/gh/kkkk10000/image-hosting/img/kmeans_result.png)
完整代码如下:
```python
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 生成随机数据集
X, y = make_blobs(n_samples=100, centers=4, random_state=42)
plt.scatter(X[:, 0], X[:, 1])
plt.show()
# 定义K-means模型
kmeans = KMeans(n_clusters=4)
# 训练模型
kmeans.fit(X)
# 预测簇标签
y_pred = kmeans.predict(X)
# 绘制结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
```
希望对你有所帮助!
kmeans算法原理和代码实现
K-means算法是一种基于聚类的机器学习算法,用于将一组数据点分成K个不同的簇。K-means算法的原理是将所有数据点分成K个簇,每个簇的中心点是所有该簇数据点的平均值,然后通过最小化所有数据点到其所在簇中心点的距离的平方和来优化簇的分配。
下面是K-means算法的代码实现(Python):
```python
import numpy as np
class KMeans:
def __init__(self, n_clusters=8, max_iter=300):
self.n_clusters = n_clusters
self.max_iter = max_iter
def fit(self, X):
self.centroids = X[np.random.choice(X.shape[0], self.n_clusters)]
for i in range(self.max_iter):
clusters = [[] for _ in range(self.n_clusters)]
for x in X:
distances = np.linalg.norm(self.centroids - x, axis=1)
cluster_idx = np.argmin(distances)
clusters[cluster_idx].append(x)
new_centroids = np.zeros_like(self.centroids)
for i, cluster in enumerate(clusters):
if len(cluster) == 0:
new_centroids[i] = self.centroids[i]
else:
new_centroids[i] = np.mean(cluster, axis=0)
if np.allclose(new_centroids, self.centroids):
break
self.centroids = new_centroids
def predict(self, X):
distances = np.linalg.norm(self.centroids - X[:, np.newaxis], axis=2)
return np.argmin(distances, axis=1)
```
这里的`fit()`方法用于训练模型,`predict()`方法用于预测数据点所属的簇。在`fit()`方法中,首先随机初始化K个簇中心点,然后使用循环迭代来优化簇的分配和簇中心点的位置。在每次循环迭代中,将所有数据点分配到最近的簇中心点,然后重新计算每个簇的中心点位置。如果新的中心点位置与旧的中心点位置相同,则停止迭代。在`predict()`方法中,使用已经训练好的模型来预测新的数据点所属的簇。
阅读全文