python对SpectralClustering的一个示例

最近帮学妹做一个谱聚类的实现,简短记录下.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()
      

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏RPZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值