机器学习课程总结,
本系列文章
以代码
和注释
为主。
理论部分搬至博客上比较耗费时间,所以缺少理论部分。但是也欢迎大家一起探讨学习。
如果需要理论部分的讲义,可私信(个人觉的讲的很好很全)。
文章目录
- 问题需求
- 代码一(密度聚类)
- 代码2(层次聚类)
- 代码3(轮廓系数)
- 总结
问题需求
现有如下样本:
(0,0), (2,1),(2,-1), (2.1,0),(4.1,0), (5,0)
1、请使用密度聚类算法DBSCAN在半径是1.1,MinPts分别为2和3的情况下,给出聚类结果。
要求简要写出一种情况下的计算过程,另一种情况可以直接给出结果。
2、请使用层次聚类算法AGNES在k=2和3的情况下,给出聚类结果。其中,簇与簇之间的距离选择最小距离。
3、针对如下样本:(0,0), (2,1),(2,-1), (2.1,0),(4.1,0), (5,0),现有聚类模型将其聚为三类:C1={(0,0)}, C2={(2,1),(2,-1), (2.1,0)} C3={(4.1,0), (5,0)}。请计算该模型的轮廓系数silhouette coefficient。
代码一(密度聚类)
# -*- coding: utf-8 -*-#
# Author: xhc
# Date: 2021-06-20 19:56
# project: 0524
# Name: 密度聚类.pyfrom sklearn.cluster import DBSCAN
import numpy as npimport matplotlib.pyplot as plt
data=[[0,0],[2,1],[2,-1],[2.1,0],[4.1,0],[5,0]]
data=np.array(data)model = DBSCAN(eps=1.1,min_samples=2) #两个参数分别表示半径和数量
#model = sklearn.cluster.DBSCAN(eps=1.1,min_samples=3)model.fit(data)
print(model.fit_predict(data))
plt.scatter(data[:,0],data[:,1], c = model.labels_)
print("MinPts=2时,聚类结果为")
print(model.labels_)
print("噪声点有:")
for i in range(6):if model.labels_[i] == -1: #当值为-1的时候表示噪声点print(data[i])
print("\n")
plt.show()
代码2(层次聚类)
# -*- coding: utf-8 -*-#
# Author: xhc
# Date: 2021-06-20 20:54
# project: 0524
# Name: 层次聚类.py# -*- coding: utf-8 -*-
"""
Created on Mon May 24 15:12:36 2021@author: win10
"""import numpy as np
import matplotlib.pyplot as mp
import sklearn.cluster as sc# 读取数据,绘制图像
x = np.array([[0, 0], [2, 1], [2, -1], [2.1, 0], [4.1, 0], [5, 0]])
print(x.shape)# 基于Agglomerativeclustering完成聚类
# model = sc.AgglomerativeClustering(n_clusters=2,linkage='single')
model = sc.AgglomerativeClustering(n_clusters=3,linkage = 'Maximum')
pred_y = model.fit_predict(x)
print(pred_y)x1 = []
x2 = []
x3 = []
for i in range(6):if pred_y[i] == 0:x1.append(list(x[i]))if pred_y[i] == 1:x2.append(list(x[i]))if pred_y[i] == 2:x3.append(list(x[i]))print('层次聚类后的结果')
print(list(x1))
print(list(x2))
print(list(x3))
# 画图显示样本数据
mp.figure('Agglomerativeclustering', facecolor='lightgray')
mp.title('Agglomerativeclustering', fontsize=16)
mp.xlabel('X', fontsize=14)
mp.ylabel('Y', fontsize=14)
mp.tick_params(labelsize=10)
mp.scatter(x[:, 0], x[:, 1], s=80, c=pred_y, cmap='brg', label='Samples')
mp.legend()
mp.show()
代码3(轮廓系数)
# -*- coding: utf-8 -*-#
# Author: xhc
# Date: 2021-06-06 19:16
# project: 0527
# Name: 轮廓系数
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples,silhouette_scoredata = np.array([[0, 0],[2, 1],[2, -1],[2.1,0],[4.1,0],[5,0]])
kmeans = KMeans(n_clusters=3,random_state=1).fit(data)
labels = kmeans.labels_
print(labels)print("轮廓系数",silhouette_samples(data,labels,metric='euclidean'))
print("平均轮廓系数",silhouette_score(data,labels,metric='euclidean'))for k in range(2,11,1):print(k)
- 轮廓系数的代码实现简单,更多的是需要掌握手算的方式。
总结
如有错误,欢迎评论或私信指出。需要
测试数据
可私信。