最近帮学妹做一个谱聚类的实现,简短记录下.txt文件向.npy的转换,及实现参数调整的一个示例。
scikit-learn 学习谱聚类SpectralClustering参数解释
n_clusters:切图时降到的维数
affinity:相似矩阵的建立方式。'nearest_neighbors':k-近邻,'precomputed':自定义,全连接方式,常用高斯核'rbf',多项式'poly',sigmoid函数'sigmoid'
eigen_solver:特征值求解的策略,{None, ‘arpack’, ‘lobpcg’, or ‘amg’}
eigen_tol:如果eigen_solver使用了arpack’,则需要通过eigen_tol指定矩阵分解停止条件
gamma:核函数参数,如果在affinity里使用了全连接方式,核函数,需要利用该参数对核函数进行调参。
degree:当使用了多项式作为核函数时,对该参数进行调参,默认为3
coef:当核函数为多项式或者sigmoid函数时进行调整,默认为1
n_neighbors:当affinity设置为'nearest_neighbors'时,该参数作为设置近邻数量
assign_labels:最后使用的聚类方式:{‘k-means’,'discritize'}
# -*- coding: utf-8 -*-
"""
Created on 09 05 2017
@author: similarface
"""
import numpy as np
from sklearn import metrics
from sklearn.cluster import SpectralClustering
#读取数据
'''
n_sample = 9783
dim = 4096
'''
def make_data():
file = open('/home/r/renpengzhen/python/SpectralClustering/result.txt')
data = file.readlines() #得到一个样本列表
Data = []
samples = data[0].split('[') #得到每一个样本,进行拆分,每个元素为一个str类型
#剔除列表中的为空的元素
while '' in samples:
samples.remove('')
# print(len(samples)) #样本个数 = 9783
for sample in samples:
d = sample[:-1].split(',')
d = [float(d[i]) for i in range(len(d))] #将字符串列表转换为数组
# print(type(d),len(d)) #样本维度 = 4096
Data += [d]
Data = np.array(Data) #将列表转换为数组
np.save('/home/r/renpengzhen/python/SpectralClustering/Data.npy',Data)
def turn_arg(X,k):
#寻找最合适的参数gamma
# 默认使用的是高斯核,需要对n_cluster和gamma进行调参,选择合适的参数
scores = []
s = dict()
for index, gamma in enumerate((0.01, 0.1, 1, 10)):
pred_y = SpectralClustering(n_clusters=k, gamma=gamma).fit_predict(X)
print("Calinski-Harabasz Score with gamma=", gamma, "score=",
metrics.calinski_harabasz_score(X, pred_y))
tmp = dict()
tmp['gamma'] = gamma
tmp['score'] = metrics.calinski_harabasz_score(X, pred_y)
s[metrics.calinski_harabasz_score(X, pred_y)] = tmp
scores.append(metrics.calinski_harabasz_score(X, pred_y))
print(np.max(scores))
print("最大得分项:")
print(s.get(np.max(scores)))
gamma = s.get(np.max(scores))['gamma']
return gamma
def main():
X = np.load('/home/r/renpengzhen/python/SpectralClustering/Data.npy')
k = 10
#默认的sp
sp = SpectralClustering()
sp.fit(X)
pred_y = sp.fit_predict(X)
print("默认-Calinski-Harabasz Score", metrics.calinski_harabasz_score(X, pred_y))
#调整参数:
gamma = turn_arg(X,k)
pred_y = SpectralClustering(n_clusters=k, gamma=gamma).fit_predict(X)
print("最优gamma-Calinski-Harabasz Score", metrics.calinski_harabasz_score(X, pred_y))
np.save('/home/r/renpengzhen/python/SpectralClustering/y_pred.npy',pred_y)
if __name__ == '__main__':
main()