机器学习 — AGNES层次聚类方法

第1关:距离的计算

任务描述

本关任务:根据本关所学知识,完成calc_min_dist函数,calc_max_dist函数以及calc_avg_dist函数分别实现计算两个簇之间的最短距离、最远距离和平均距离。

import numpy as np

def calc_min_dist(cluster1, cluster2):

'''

计算簇间最小距离

:param cluster1:簇1中的样本数据,类型为ndarray

:param cluster2:簇2中的样本数据,类型为ndarray

:return:簇1与簇2之间的最小距离

'''

#********* Begin *********#

min_dist = np.inf

for i in range(len(cluster1)):

for j in range(len(cluster2)):

dist = np.sqrt(np.sum(np.square(cluster1[i] - cluster2[j])))

if dist < min_dist:

min_dist = dist

return min_dist

#********* End *********#

def calc_max_dist(cluster1, cluster2):

'''

计算簇间最大距离

:param cluster1:簇1中的样本数据,类型为ndarray

:param cluster2:簇2中的样本数据,类型为ndarray

:return:簇1与簇2之间的最大距离

'''

#********* Begin *********#

max_dist = 0

for i in range(len(cluster1)):

for j in range(len(cluster2)):

dist = np.sqrt(np.sum(np.square(cluster1[i] - cluster2[j])))

if dist > max_dist:

max_dist=dist

return max_dist

#********* End *********#

def calc_avg_dist(cluster1, cluster2):

'''

计算簇间平均距离

:param cluster1:簇1中的样本数据,类型为ndarray

:param cluster2:簇2中的样本数据,类型为ndarray

:return:簇1与簇2之间的平均距离

'''

#********* Begin *********#

num = len(cluster1)*len(cluster2)

avg_dist = 0

for i in range(len(cluster1)):

for j in range(len(cluster2)):

dist = np.sqrt(np.sum(np.square(cluster1[i] - cluster2[j])))

avg_dist +=dist

avg_dist = avg_dist/num

return avg_dist

#********* End *********#

第2关:AGNES算法流程

任务描述

本关任务:补充python代码,完成AGNES函数完成聚类功能。

import numpy as np

def AGNES(feature, k):

'''

AGNES聚类并返回聚类结果

假设数据集为`[1, 2], [10, 11], [1, 3]],那么聚类结果可能为`[[1, 2], [1, 3]], [[10, 11]]]

:param feature:训练数据集所有特征组成的ndarray

:param k:表示想要将数据聚成`k`类,类型为`int`

:return:聚类结果

'''

#********* Begin *********#

# 找到距离最小的下标

def find_Min(M):

min = np.inf

x = 0;

y = 0

for i in range(len(M)):

for j in range(len(M[i])):

if i != j and M[i][j] < min:

min = M[i][j];

x = i;

y = j

return (x, y, min)

#计算簇间最大距离

def calc_max_dist(cluster1, cluster2):

max_dist = 0

for i in range(len(cluster1)):

for j in range(len(cluster2)):

dist = np.sqrt(np.sum(np.square(cluster1[i] - cluster2[j])))

if dist > max_dist:

max_dist = dist

return max_dist

#初始化C和M

C = []

M = []

for i in feature:

Ci = []

Ci.append(i)

C.append(Ci)

for i in C:

Mi = []

for j in C:

Mi.append(calc_max_dist(i, j))

M.append(Mi)

q = len(feature)

#合并更新

while q > k:

x, y, min = find_Min(M)

C[x].extend(C[y])

C.pop(y)

M = []

for i in C:

Mi = []

for j in C:

Mi.append(calc_max_dist(i, j))

M.append(Mi)

q -= 1

return C

#********* End *********#

第3关:红酒聚类

任务描述

本关任务:sklearn中的AgglomerativeClustering类实现了AGNES算法,本关你需要使用 sklearn 中AgglomerativeClustering来对红酒数据进行聚类。

from sklearn.cluster import AgglomerativeClustering

from sklearn.preprocessing import StandardScaler

def Agglomerative_cluster(data):

'''

对红酒数据进行聚类

:param data: 数据集,类型为ndarray

:return: 聚类结果,类型为ndarray

'''

# 数据预处理:标准化处理,使得每个特征的均值为0,标准差为1

scaler = StandardScaler()

data_scaled = scaler.fit_transform(data)

# 创建AgglomerativeClustering实例,设置聚类数为3,使用ward方法来计算簇间距离

agnes = AgglomerativeClustering(n_clusters=3, linkage='ward')

# 训练模型并获取聚类结果

result = agnes.fit_predict(data_scaled)

return result

# 示例调用

# 假设有一个名为wine_data的ndarray,包含了红酒数据集

# result = Agglomerative_cluster(wine_data)

# print(result)

from sklearn.cluster import AgglomerativeClustering

from sklearn.preprocessing import StandardScaler

def Agglomerative_cluster(data):

'''

对红酒数据进行聚类

:param data: 数据集,类型为ndarray

:return: 聚类结果,类型为ndarray

'''

# 数据预处理:标准化处理,使得每个特征的均值为0,标准差为1

scaler = StandardScaler()

data_scaled = scaler.fit_transform(data)

# 创建AgglomerativeClustering实例,设置聚类数为3,使用ward方法来计算簇间距离

agnes = AgglomerativeClustering(n_clusters=3, linkage='ward')

# 训练模型并获取聚类结果

result = agnes.fit_predict(data_scaled)

return result

# 示例调用

# 假设有一个名为wine_data的ndarray,包含了红酒数据集

# result = Agglomerative_cluster(wine_data)

# print(result)

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。