Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pandas as pd
- from sklearn.decomposition import PCA
- from pandas import read_csv
- from pandas import DataFrame
- from math import pow,sqrt
- from sklearn import metrics
- import numpy as np
- import datetime
- import random
- from sklearn.cluster import KMeans
- from sklearn.preprocessing import StandardScaler #標準化
- from sompy import SOMFactory
- import os
- #輸入資料
- trainData = read_csv("iris.csv",encoding = "cp950")#匯入資料
- trainData=trainData.drop(["屬種"],axis=1)#去掉Lable
- data_name=list(trainData.columns)#取data名子
- trainData=np.array(trainData)#將dataframe轉成array形式
- mapsize = [12,12]#建立神經元個數#如果是寬=Feature,長=data len
- sm = SOMFactory().build(trainData, mapsize, normalization = 'var', initialization='random',component_names=data_name)#
- #trainData=你要分群之資料,
- #mapsize=地圖大小
- #normalization = 'var'標準化,這個參數是固定的
- #initialization='random',為初始化權重怎麼取,這邊是隨機取,所以random,也可以改成'pca'
- 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)
- # verbose='info'為叫出運算資料,如果=False的話,就不會顯示運算資料
- #train_rough_len=500為粗暴培訓之迭代次數
- #train_rough_radiusin=5為粗暴培訓開始所取之範圍
- #train_rough_radiusfin=1為粗暴培訓最後所取之範圍
- #train_finetune_len=500為微調培訓之迭代次數
- #train_finetune_radiusin=5為微調培訓開始所取之範圍
- #train_finetune_radiusfin=1為微調培訓最後所取之範圍
- from sompy.visualization.mapview import View2D #單一變數之資訊投射作圖#左邊那個bar為資料資料之資訊
- view2D = View2D(12,12,"rand data",text_size=10)
- view2D.show(sm, col_sz=4, which_dim="all", desnormalize=True)
- from sompy.visualization.hitmap import HitMapView #將具類過的神經元透過K-Meams分群
- sm.cluster(3)
- hits = HitMapView(20,20,"Clustering",text_size=12)
- a=hits.show(sm)
- from sompy.visualization.umatrix import UMatrixView
- u = UMatrixView(50, 50, 'umatrix', show_axis=True, text_size=8, show_text=True)
- #This is the Umat value
- UMAT = u.build_u_matrix(sm, distance=1, row_normalized=False)
- #Here you have Umatrix plus its render
- UMAT = u.show(sm, distance2=1, row_normalized=False, show_data=True, contooor=True, blob=False)
- #邏輯:我們這邊有每個資料(資料順序與輸入資料順序是一樣的)屬於哪個神經元,以及每個神經元屬於第幾群
- #所以我們只要將資料屬於哪個神經元及神經元屬於第幾群合併,即可得到每筆資料屬於哪一群
- #===========================
- #每筆資料對應第幾個神經元的資料處理
- data_to_Neur=sm.project_data(trainData)#每個資料對應第幾個神經元#這邊的index是資料的排序
- data_location_to_Neur = sm.bmu_ind_to_xy(data_to_Neur)#每個資料在哪個座標之神經元
- data_to_Neur={"key":data_to_Neur}#對data_to_Neur資料命名為KEY
- data_to_Neur1=pd.DataFrame(data_to_Neur)#對生data_to_Neur成dataframe形式
- #=======================
- #自動化生成index
- n=data_to_Neur1.shape[0]#資料之RAW個數
- key=list(range(n))
- key={"key":key}#對生成之index先命名
- key=pd.DataFrame(key)#生出index之dataframe
- #========================
- #每個神經元屬於第幾群之資料處理
- label=getattr(sm, 'cluster_labels')#每個神經元屬於第幾群#這邊index的是資料神經元的排序
- label={"cluster":label}#對上面那行進行命名
- label=pd.DataFrame(label)#轉成資料庫形式
- label=pd.concat([label,key], axis=1, join_axes=[label.index])#將第65行之index併入label#這邊的index電腦能辨識
- #===========================
- #將資料屬於哪個神經元及神經元屬於第幾群合併,即可得到每筆資料屬於哪一群
- cluster=data_to_Neur1.merge(label, left_on='key', right_on='key', how='left')
- cluster_final=cluster.drop(["key"],axis=1)
- cluster_final.to_csv('cluster_data.csv')
Advertisement
Add Comment
Please, Sign In to add comment