谱聚类及其创新思考(python)

Rena ·
更新时间:2024-09-21
· 582 次阅读

#谱聚类 ''' 对样本求相似性矩阵, 其实就是把每个sample当作一个node,构建一个图关系。 1 求向量之间的关系有很多方法 比如 F1范数, F2范数, 无穷范数,余弦 f(x1, x2)---> scalar 如果大家想改进的话这里我建议可以用度量学习的技巧去替换求向量之间关系的方法 ''' import numpy as np def distance(x1, x2): dis = 0 for i in range(x1.shape[0]): dis += (x1[i] - x2[i]) ** 2 return np.e ** (-np.sqrt(dis)/2) # 很显然是两个类(1, 0, 1)&(1, 5, 0) (100, 100, 100)&(99, 100, 99) x = np.array([[1, 0, 1], [1, 5, 0], [100, 100, 100], [99, 100, 99]]) # 构建一个W:= 相似度矩阵 W = np.zeros((4, 4)) for i in range(x.shape[0]): for j in range(x.shape[0]): W[i][j] = distance(x[i], x[j]) # 对称阵有很多好的性质,1.存储数据的时候能节省接近一半的资源,2.是方阵可以求逆矩阵, 3.有n个不同的特征值与特征向量 #print(W) ''' 求度矩阵D之后就求拉普拉斯矩阵了 拉普拉斯矩阵为L= D - W纯粹为巧合,在推导式时出发点为拉普拉斯算子即我们求离散数据的每个节点的势 拉普拉斯矩阵的每一行代表了图中每个节点的收益。(节点做一次差其实对应了求一次导数, 二阶导数为节点做两次差的和) ''' D = np.zeros((4, 4)) D[0][0] = np.sum(W, axis=0)[0] D[1][1] = np.sum(W, axis=0)[1] D[2][2] = np.sum(W, axis=0)[2] D[3][3] = np.sum(W, axis=0)[3] #print(D) L = np.zeros((4, 4)) L = D - W #print(L) ''' 1. 类似于降维,但是这里很多博客表述的并不对,首先我们没有将求出的特征向量组成的矩阵对原始矩阵进行矩阵乘法,降低维度 2. 这里我只用了一个向量 ''' eigenvalue, featurevector = np.linalg.eig(L) f_v = featurevector[:, np.argmax(eigenvalue)] print(f_v) # [ 1.92585366e-38 8.23138568e-38 7.07106781e-01 -7.07106781e-01] # 结果很显然 前两个是一对,后两个是一对 我们的维度很低 没必要用k-means 如果你想创新可以换一个聚类方法
作者:小然_ran



创新 谱聚类 聚类 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号