FINLAB

11

Oct 9th, 2019
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.00 KB | None | 0 0
  1. import pandas as pd
  2. from sklearn.decomposition import PCA
  3. from pandas import read_csv
  4. from pandas import DataFrame
  5. from math import pow,sqrt
  6. from sklearn import metrics
  7. import numpy as np
  8. import datetime
  9. import random
  10. from sklearn.cluster import KMeans
  11. from sklearn.preprocessing import StandardScaler #標準化
  12. from sompy import SOMFactory
  13. import os
  14. #輸入資料
  15. trainData = read_csv("iris.csv",encoding = "cp950")#匯入資料
  16. trainData=trainData.drop(["屬種"],axis=1)#去掉Lable
  17. data_name=list(trainData.columns)#取data名子
  18. trainData=np.array(trainData)#將dataframe轉成array形式
  19. mapsize = [12,12]#建立神經元個數#如果是寬=Feature,長=data len
  20.  
  21. sm = SOMFactory().build(trainData, mapsize, normalization = 'var', initialization='random',component_names=data_name)#
  22. #trainData=你要分群之資料,
  23. #mapsize=地圖大小
  24. #normalization = 'var'標準化,這個參數是固定的
  25. #initialization='random',為初始化權重怎麼取,這邊是隨機取,所以random,也可以改成'pca'
  26. sm.train(n_job=1, verbose='info', train_rough_len=100, train_rough_radiusin=5, train_rough_radiusfin=1, train_finetune_len=100, train_finetune_radiusin=5, train_finetune_radiusfin=1)
  27. # verbose='info'為叫出運算資料,如果=False的話,就不會顯示運算資料
  28. #train_rough_len=500為粗暴培訓之迭代次數
  29. #train_rough_radiusin=5為粗暴培訓開始所取之範圍
  30. #train_rough_radiusfin=1為粗暴培訓最後所取之範圍
  31. #train_finetune_len=500為微調培訓之迭代次數
  32. #train_finetune_radiusin=5為微調培訓開始所取之範圍
  33. #train_finetune_radiusfin=1為微調培訓最後所取之範圍
  34.  
  35.  
  36.  
  37. from sompy.visualization.mapview import View2D  #單一變數之資訊投射作圖#左邊那個bar為資料資料之資訊
  38. view2D  = View2D(12,12,"rand data",text_size=10)
  39. view2D.show(sm, col_sz=4, which_dim="all", desnormalize=True)
  40.  
  41. from sompy.visualization.hitmap import HitMapView  #將具類過的神經元透過K-Meams分群
  42. sm.cluster(3)
  43. hits  = HitMapView(20,20,"Clustering",text_size=12)
  44. a=hits.show(sm)
  45.  
  46.  
  47. from sompy.visualization.umatrix import UMatrixView
  48.  
  49. u = UMatrixView(50, 50, 'umatrix', show_axis=True, text_size=8, show_text=True)
  50. #This is the Umat value
  51. UMAT  = u.build_u_matrix(sm, distance=1, row_normalized=False)
  52. #Here you have Umatrix plus its render
  53. UMAT = u.show(sm, distance2=1, row_normalized=False, show_data=True, contooor=True, blob=False)
  54.  
  55. #邏輯:我們這邊有每個資料(資料順序與輸入資料順序是一樣的)屬於哪個神經元,以及每個神經元屬於第幾群
  56. #所以我們只要將資料屬於哪個神經元及神經元屬於第幾群合併,即可得到每筆資料屬於哪一群
  57. #===========================
  58. #每筆資料對應第幾個神經元的資料處理
  59. data_to_Neur=sm.project_data(trainData)#每個資料對應第幾個神經元#這邊的index是資料的排序
  60. data_location_to_Neur = sm.bmu_ind_to_xy(data_to_Neur)#每個資料在哪個座標之神經元
  61. data_to_Neur={"key":data_to_Neur}#對data_to_Neur資料命名為KEY
  62. data_to_Neur1=pd.DataFrame(data_to_Neur)#對生data_to_Neur成dataframe形式
  63. #=======================
  64. #自動化生成index
  65. n=data_to_Neur1.shape[0]#資料之RAW個數
  66. key=list(range(n))
  67. key={"key":key}#對生成之index先命名
  68. key=pd.DataFrame(key)#生出index之dataframe
  69. #========================
  70. #每個神經元屬於第幾群之資料處理
  71. label=getattr(sm, 'cluster_labels')#每個神經元屬於第幾群#這邊index的是資料神經元的排序
  72. label={"cluster":label}#對上面那行進行命名
  73. label=pd.DataFrame(label)#轉成資料庫形式
  74. label=pd.concat([label,key], axis=1, join_axes=[label.index])#將第65行之index併入label#這邊的index電腦能辨識
  75. #===========================
  76. #將資料屬於哪個神經元及神經元屬於第幾群合併,即可得到每筆資料屬於哪一群
  77. cluster=data_to_Neur1.merge(label, left_on='key', right_on='key', how='left')
  78. cluster_final=cluster.drop(["key"],axis=1)
  79. cluster_final.to_csv('cluster_data.csv')
Advertisement
Add Comment
Please, Sign In to add comment