[英]Visualizing SOM and adding labels to the map
I have been trying to apply SOM on my dataframe, my dataframe has 25 columns where each column represents a house, each house has a values for power consumption for two years, and I want to cluster the data with number of clusters = 3. I have done the following:我一直在尝试在我的 dataframe 上应用 SOM,我的 dataframe 有 25 列,其中每列代表一个房子,每个房子都有一个两年的功耗值,我想用集群数 = 3 对数据进行聚类。我做了以下事情:
import sys
sys.path.insert(0, '../')
%load_ext autoreload
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import plot,axis,show,pcolor,colorbar,bone
from matplotlib.patches import Patch
%matplotlib inline
from minisom import MiniSom
from sklearn.preprocessing import minmax_scale, scale
%autoreload 2
data1 = pd.read_excel(r"C:\Users\user\Desktop\Thesis\Tarek\Consumption.xlsx")
data1['h1'] = data1['h1'].str.split(';').str[2].astype('float')
data1['h2'] = data1['h2'].str.split(';').str[2].astype('float')
data1['h3'] = data1['h3'].str.split(';').str[2].astype('float')
data1['h4'] = data1['h4'].str.split(';').str[2].astype('float')
data1['h5'] = data1['h5'].str.split(';').str[2].astype('float')
data1['h6'] = data1['h6'].str.split(';').str[2].astype('float')
data1['h7'] = data1['h7'].str.split(';').str[2].astype('float')
data1['h8'] = data1['h8'].str.split(';').str[2].astype('float')
data1['h9'] = data1['h9'].str.split(';').str[2].astype('float')
data1['h10'] = data1['h10'].str.split(';').str[2].astype('float')
data1['h11'] = data1['h11'].str.split(';').str[2].astype('float')
data1['h12'] = data1['h12'].str.split(';').str[2].astype('float')
data1['h13'] = data1['h13'].str.split(';').str[2].astype('float')
data1['h14'] = data1['h14'].str.split(';').str[2].astype('float')
data1['h15'] = data1['h15'].str.split(';').str[2].astype('float')
data1['h16'] = data1['h16'].str.split(';').str[2].astype('float')
data1['h17'] = data1['h17'].str.split(';').str[2].astype('float')
data1['h18'] = data1['h18'].str.split(';').str[2].astype('float')
data1['h19'] = data1['h19'].str.split(';').str[2].astype('float')
data1['h20'] = data1['h20'].str.split(';').str[2].astype('float')
data1['h21'] = data1['h21'].str.split(';').str[2].astype('float')
data1['h22'] = data1['h22'].str.split(';').str[2].astype('float')
data1['h23'] = data1['h23'].str.split(';').str[2].astype('float')
data1['h24'] = data1['h24'].str.split(';').str[2].astype('float')
data1['h25'] = data1['h25'].str.split(';').str[2].astype('float')
data1.fillna(0,inplace=True)
data1=data1.round(decimals=2)
X=data1.values
som =MiniSom(x=3,y=3,input_len=25,sigma=1.0, learning_rate=0.5)
som.random_weights_init(X)
som.train_batch(data=X ,num_iteration=1000,verbose=True)
bone()
pcolor(som.distance_map().T)
colorbar()
markers = ['o' , 's','v']
colors = ['r', 'g','y']
for i, x in enumerate(X):
w = som.winner(x)
plot(w[0] + 0.5,
w[1] + 0.5,
markers[i],
markeredgecolor = colors[i],
markerfacecolor = 'None',
markersize = 10,
markeredgewidth = 2)
show()
when I am running the code, I am getting this error: IndexError: list index out of range please any tips to add the markers and colors in the right way without having any problems, and I would be glad if any one can help, I am a bit new to Python and tried to find a solution but I couldn`t find any.当我运行代码时,我收到此错误:IndexError: list index out of range 请任何提示以正确的方式添加标记和 colors 没有任何问题,如果有人可以提供帮助,我会很高兴,我我对 Python 有点陌生,并试图找到解决方案,但我找不到任何解决方案。
The problem seems to be that the length of your X=data1.values
is around 25 but the length of your markers
and colors
is only 3. So in the following for loop, when i
is 3, you are trying to access markers[3]
and colors[3]
which throws an IndexError
because both markers
and colors
goes up to index 2 (indexing starts from 0 in python)问题似乎是您的X=data1.values
的长度约为 25,但您的markers
和colors
的长度仅为 3。因此在以下 for 循环中,当i
为 3 时,您正在尝试访问markers[3]
和colors[3]
会引发IndexError
,因为markers
和colors
都上升到索引 2(在 python 中索引从 0 开始)
for i, x in enumerate(X):
One solution is to define custom list of 25 markers and 25 colors.一种解决方案是定义 25 个标记和 25 个 colors 的自定义列表。 While you might want to define your own markers, you can leave the colors
out and let the code choose automatic colors for the markeredgecolor
虽然您可能想要定义自己的标记,但您可以将colors
留在外面,让代码为 markeredgecolor 选择自动markeredgecolor
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.