Python不调用已有的函数和库,自己写算法实现鸢尾花AGNES,DBScan算法
时间: 2024-05-16 14:13:26 浏览: 96
好的,下面我来介绍一下如何实现鸢尾花数据集的AGNES和DBSCAN聚类算法。
## AGNES算法实现
AGNES全称为Agglomerative Nesting,即聚合层次聚类算法,是一种自下而上的聚类算法。其流程如下:
1. 将每个数据点看作一个独立的簇。
2. 计算两个簇之间的距离,一般采用欧几里得距离或者曼哈顿距离。
3. 将距离最近的两个簇合并成一个新的簇。
4. 重复步骤2和步骤3,直到所有的数据点都被聚成一个簇。
下面是使用Python手动实现AGNES算法的代码:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 加载数据
data = pd.read_csv('iris.csv')
# 取出特征数据
X = data.iloc[:, :-1].values
# 定义距离函数,这里采用欧几里得距离
def dist(a, b):
return np.sqrt(np.sum((a - b) ** 2))
# 计算两个簇的距离,这里采用最短距离法
def min_dist(ci, cj):
return min([dist(xi, xj) for xi in ci for xj in cj])
# 初始化簇
clusters = [[xi] for xi in X]
# AGNES聚类
while len(clusters) > 1:
# 计算任意两个簇之间的距离
dists = [[min_dist(ci, cj) for cj in clusters] for ci in clusters]
i, j = np.unravel_index(np.argmin(dists), np.shape(dists))
# 合并簇
clusters[i] += clusters[j]
clusters.pop(j)
# 可视化聚类结果
colors = ['red', 'blue', 'green']
for i, cluster in enumerate(clusters):
for xi in cluster:
plt.scatter(xi[0], xi[1], c=colors[i])
plt.title('AGNES Clustering')
plt.show()
```
## DBSCAN算法实现
DBSCAN全称为Density-Based Spatial Clustering of Applications with Noise,即基于密度的聚类算法,是一种自下而上的聚类算法。其流程如下:
1. 随机选择一个未被访问的数据点P。
2. 检查P的邻域中是否有足够数量的数据点。
3. 如果P的邻域中数据点数量足够,则将P加入一个新簇中,并将其邻域中的数据点加入该簇中。
4. 如果P的邻域中数据点数量不足,则将P标记为噪声点。
5. 重复步骤1至步骤4,直到所有的数据点都被访问过。
下面是使用Python手动实现DBSCAN算法的代码:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 加载数据
data = pd.read_csv('iris.csv')
# 取出特征数据
X = data.iloc[:, :-1].values
# 定义距离函数,这里采用欧几里得距离
def dist(a, b):
return np.sqrt(np.sum((a - b) ** 2))
# DBSCAN聚类
def dbscan(X, eps, min_pts):
# 初始化标记数组和簇标记
labels = np.zeros(len(X))
cluster = 0
# 遍历所有数据点
for i in range(len(X)):
# 如果该点已经被访问过,则跳过
if labels[i] != 0:
continue
# 获取该点的邻域
neighbors = [j for j in range(len(X)) if dist(X[i], X[j]) <= eps]
# 如果邻域中数据点数量小于min_pts,则将该点标记为噪声点
if len(neighbors) < min_pts:
labels[i] = -1
# 否则将该点加入一个新簇中,并将其邻域中的数据点加入该簇中
else:
cluster += 1
labels[i] = cluster
for j in neighbors:
if labels[j] == -1:
labels[j] = cluster
elif labels[j] == 0:
labels[j] = cluster
new_neighbors = [k for k in range(len(X)) if dist(X[j], X[k]) <= eps]
if len(new_neighbors) >= min_pts:
neighbors += new_neighbors
return labels
# 调用DBSCAN算法
labels = dbscan(X, eps=0.5, min_pts=5)
# 可视化聚类结果
colors = ['red', 'blue', 'green']
for i in range(len(X)):
if labels[i] == -1:
plt.scatter(X[i][0], X[i][1], c='black')
else:
plt.scatter(X[i][0], X[i][1], c=colors[int(labels[i])-1])
plt.title('DBSCAN Clustering')
plt.show()
```
以上就是使用Python手动实现鸢尾花数据集的AGNES和DBSCAN聚类算法的全部内容。
阅读全文