您的位置:首页 > 其它

《机器学习》周志华西瓜书习题参考答案:第9章 - 聚类

2019-09-24 16:58 661 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/TeFuirnever/article/details/101280858

【机器学习】《机器学习》周志华西瓜书 笔记/习题答案 总目录

——————————————————————————————————————————————————————

习题


回顾一下性质:(《机器学习》周志华西瓜书学习笔记(九):聚类

非负性、同一性、对称性很显然都是符合的,关键是直递性了,关于直递性就是闵可夫斯基不等式的证明,具体参考:闵可夫斯基不等式


  • 非负性:disth(X,Z)=max⁡x∈Xmin⁡z∈Z∥x−z∥2≥0dist_h(X,Z)=\max_{x\in X}\min_{z\in Z}\Vert x-z\Vert_2\geq0disth​(X,Z)=maxx∈X​minz∈Z​∥x−z∥2​≥0,所以 distH(X,Z)≥0dist_H(X,Z)\geq0distH​(X,Z)≥0。若 disth(Z,X)≥distH(X,Z)dist_h(Z,X) \geq dist_H(X,Z)disth​(Z,X)≥distH​(X,Z),则两个都大于0,maxmaxmax 时最后结果大于0,否则小于0,maxmaxmax 时最后结果还是大于0;
  • 同一性: 假设 xi≠zix_i\ne z_ixi​​=zi​ ,其他的样本都完全相同时,那么对于 xj,j=1,2,..i−1,i,...,nx_j,j=1, 2,..i-1, i,...,nxj​,j=1,2,..i−1,i,...,n 都有 zjz_jzj​ 使得 min⁡z∈Z∥xj−z∥2=0\min_{z\in Z}\Vert x_j-z\Vert_2=0minz∈Z​∥xj​−z∥2​=0 ,而对于 xix_ixi​ ,由于没有相同的样本,所以 min⁡z∈Z∥xi−z∥2>0⇒max⁡x∈Xmin⁡z∈Z∥x−z∥2>0\min_{z\in Z}\Vert x_i-z\Vert_2>0\Rightarrow \max_{x\in X}\min_{z\in Z}\Vert x-z\Vert_2>0minz∈Z​∥xi​−z∥2​>0⇒maxx∈X​minz∈Z​∥x−z∥2​>0 ,当且仅当相等时成立;
  • 对称性:distH(X,Z)=max⁡(dishh(X,Z),disth(Z,X))=max⁡(disth(Z,X),dishh(X,Z))=distH(Z,X)dist_H(X,Z)=\max(dish_h(X,Z),dist_h(Z,X))=\max(dist_h(Z,X),dish_h(X,Z))=dist_H(Z,X)distH​(X,Z)=max(dishh​(X,Z),disth​(Z,X))=max(disth​(Z,X),dishh​(X,Z))=distH​(Z,X);
  • 直递性:暂时不会。。。。。。



不能,因为 k 均值本身是 NP 问题,而且 9.24 是非凸的(具体证明不太懂),容易陷入局部最优,所以在使用 k 均值时常常多次随机初始化中心点,然后在中心点附近挑选结果最好的一个,即局部最优解,无法找到全局最优解。


代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import ConvexHull

class KMeans(object):
def __init__(self, k):
self.k = k

def fit(self, X, initial_centroid_index=None, max_iters=10, seed=16, plt_process=False):
m, n = X.shape
# 没有指定中心点时,随机初始化中心点
if initial_centroid_index is None:
np.random.seed(seed)
initial_centroid_index = np.random.randint(0, m, self.k)
centroid = X[initial_centroid_index, :]
idx = None

# 打开交互模式
plt.ion()
for i in range(max_iters):
# 按照中心点给样本分类
idx = self.find_closest_centroids(X, centroid)
if plt_process:
self.plot_converge(X, idx, initial_centroid_index)
# 重新计算中心点
centroid = self.compute_centroids(X, idx)
# 关闭交互模式
plt.ioff()
plt.show()
return centroid, idx

def find_closest_centroids(self, X, centroid):
# 这种方式利用 numpy 的广播机制,直接计算样本到各中心的距离,不用循环,速度比较快,但是在样本比较大时,更消耗内存
distance = np.sum((X[:, np.newaxis, :] - centroid) ** 2, axis=2)
idx = distance.argmin(axis=1)
return idx

def compute_centroids(self, X, idx):
centroids = np.zeros((self.k, X.shape[1]))
for i in range(self.k):
centroids[i, :] = np.mean(X[idx == i], axis=0)
return centroids

def plot_converge(self, X, idx, initial_idx):
plt.cla() # 清除原有图像
plt.title("k-meas converge process")
plt.xlabel('density')
plt.ylabel('sugar content')
plt.scatter(X[:, 0], X[:, 1], c='lightcoral')
# 标记初始化中心点
plt.scatter(X[initial_idx, 0], X[initial_idx, 1], label='initial center', c='k')
# 画出每个簇的凸包
for i in range(self.k):
X_i = X[idx == i]
# 获取当前簇的凸包索引
hull = ConvexHull(X_i).vertices.tolist()
hull.append(hull[0])
plt.plot(X_i[hull, 0], X_i[hull, 1], 'c--')
plt.legend()
plt.pause(0.5)

if __name__ == '__main__':
data = np.loadtxt('..\data\watermelon4_0_Ch.txt', delimiter=', ')
centroid, idx = KMeans(3).fit(data, plt_process=True, seed=24)



证明如下:

连接性: 由于任意 x′∈Dx^{'} \in Dx′∈D 都由 xxx 密度可达,于是任意 xi,xj∈Dx_i,x_j\in Dxi​,xj​∈D 都可通过 xxx 密度相连;

最大性:xi∈D⇒xix_i \in D\Rightarrow x_ixi​∈D⇒xi​ 由 xxx 密度可达,又 xjx_jxj​ 由 xix_ixi​ 密度可达 ⇒xj\Rightarrow x_j⇒xj​ 由 xxx 密度可达 ⇒xj∈D\Rightarrow x_j \in D⇒xj​∈D 。


最小距离由两个簇的最近样本决定,最大距离由两个簇的最远样本决定。具体区别如下:

  • 最大距离,可以认为是所有类别首先生成一个能包围所有类内样本的最小圆,然后所有圆同时慢慢扩大相同的半径,直到某个类圆能完全包围另一个类的所有点就停止,并合并这两个类。由于此时的圆已经包含另一个类的全部样本,所以称为全连接。

  • 最小距离,可以认为是扩大时遇到第一个非自己类的点就停止,并合并这两个类。由于此时的圆只包含另一个类的一个点,所以称为单连接。

  • 原型聚类:输出线性分类边界的聚类算法显然都是凸聚类,这样的算法有:K均值,LVQ;而曲线分类边界的也显然是非凸聚类,高斯混合聚类,在簇间方差不同时,其决策边界为弧线,所以高混合聚类为非凸聚类;
  • 密度聚类:DBSCAN是非凸聚类;
  • 层次聚类:AGENS是凸聚类。


暂无待补


样本 xi,xjx_i,x_jxi​,xj​ 的距离为:d(xi,xj)=∑n=1Nδijndijn∑n=1Nδijnd(x_i,x_j)=\frac{\sum_{n=1}^{N}\delta^n_{ij}d^n_{ij}}{\sum_{n=1}^{N}\delta^n_{ij}}d(xi​,xj​)=∑n=1N​δijn​∑n=1N​δijn​dijn​​ ,其中当 xin,xjnx_{in},x_{jn}xin​,xjn​ 缺失时,δijn=0\delta^n_{ij}=0δijn​=0 ,其他情况为1;

  • 当前属性 nnn 为数值类型时, dijn=∣xin−xjn∣max⁡(X)−min⁡(X)d^n_{ij} =\frac{\left| x_{in}-x_{jn} \right|}{\max(X)-\min(X)}dijn​=max(X)−min(X)∣xin​−xjn​∣​ ;
  • 当前属性 nnn 为类别型或二元型时,xin=xjnx_{in}=x_{jn}xin​=xjn​ 时, dijn=1d_{ij}^n=1dijn​=1 ,否则为 0 ;
  • 当前属性 nnn 为序数型时,即 xin∈[1,2,...,Mn]x_{in}\in[1, 2,...,M_n]xin​∈[1,2,...,Mn​] ,先将其归一化, zin=xin−1Mn−1z_{in} = \frac {x_{in}-1}{M_n -1}zin​=Mn​−1xin​−1​ ,然后将 zinz_{in}zin​ 作为数值属性来处理。

这里的计算其实很简单,就是把连续属性归一化;而离散属性有序时则归一化,再按照连续属性处理,无序时则相等为 1 ,不等为 0。

参考:《数据挖掘概念与技术》韩家炜,2.4节


《X-meas: Extending K-means with Efficient Estimation of the Number of Clusters》给出了一个自动确定 k 值的方法。

参考文章

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: