Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PCA analysis on blobs
#1
I am trying to do PCA analysis on the classical makeblobs routine. There is a problem with the drawing the arrows. The code and the error message are
below.

import random
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import matplotlib.colors
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_blobs
import pandas as pd

class PCA_trials2():

    def __init__(self):
        self.LayerNo = 3
        self.LayerIdx = np.asarray([1, 2, 3])
        self.MaxPercNo = 735  # Maximum perceptron, neuron, numbers per layer
        self.InitPerNo = 4  # Number of perceptrons in the input layer
        self.LengthSample = 100
        self.delta = 0.01
        self.Event = self.InitPerNo  # Number of detected events initially
        self.PercNo_Layer = np.asarray([60, 20, 60])

    def draw_vector(self, v0, v1, ax=None):
        ax = ax or plt.gca()
        arrowprops=dict(arrowstyle='->',
                        linewidth=2,
                        shrinkA=0, shrinkB=0)
        ax.annotate('', v1, v0, arrowprops=arrowprops)

    def GenerateDataandPCA(self):
        # creating my own color map for better visualization
        my_cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["red", "yellow", "green"])

        # Generating data with multi class
        data, labels = make_blobs(n_samples=self.LengthSample, centers=1, n_features=self.PercNo_Layer[0],
                                  random_state=0)

        # Add some noise
        noise = np.asarray([np.random.normal(0, 1, size=self.LengthSample) for _ in range(self.PercNo_Layer[0])]).reshape(self.LengthSample, self.PercNo_Layer[0])
        data_noisy = data + noise

        # converting the multi-class to binary
        labels_orig = labels
        labels_binary = np.mod(labels_orig, 2)

        X_train, X_val, Y_train, Y_val = train_test_split(data, labels_binary, stratify=labels, random_state=0)

        (n_samples, n_features) = X_val.shape
        pca = PCA(n_components=min(n_samples, n_features), whiten=True).fit(X_val)
        data_pca = pca.transform(data)

        return data, data_noisy, data_pca, labels_orig, labels_binary, my_cmap, X_train, X_val, Y_train, Y_val, pca

    def main_Visualize(self):

        data_pca = self.GenerateDataandPCA()[2]
        pca = self.GenerateDataandPCA()[10]


        fig, ax = plt.subplots(1, 2, figsize=(16, 6))
        fig.subplots_adjust(left=0.0625, right=0.95, wspace=0.1)

        # plot data
        ax[0].scatter(data_pca[:, 0], data_pca[:, 1], alpha=0.2)

        for l, v in zip(pca.explained_variance_, pca.components_):
            self.draw_vector([0, 0], v * l * 3, ax[0])

        # for length, vector in zip(pca.explained_variance_, pca.components_):
        #     v = vector * 3 * np.sqrt(length)
        #     self.draw_vector(pca.mean_, pca.mean_ + v, ax=ax[0])
        ax[0].axis('equal');
        ax[0].set(xlabel='x', ylabel='y', title='input')

        # plot principal components

        ax[1].scatter(data_pca[:, 0], data_pca[:, 1], alpha=0.2)
        # self.draw_vector([0, 0], [0, 3], ax=ax[1])
        # self.draw_vector([0, 0], [3, 0], ax=ax[1])
        ax[1].axis('equal')
        ax[1].set(xlabel='component 1', ylabel='component 2',
                  title='principal components',
                  xlim=(-5, 5), ylim=(-3, 3.1))

        plt.show()

        return data_pca
Error:
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__ return self.func(*args) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 814, in callit func(*args) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\backends\_backend_tk.py", line 240, in idle_draw self.draw() File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 9, in draw super().draw() File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\backends\backend_agg.py", line 406, in draw self.figure.draw(self.renderer) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\artist.py", line 74, in draw_wrapper result = draw(artist, renderer, *args, **kwargs) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\artist.py", line 51, in draw_wrapper return draw(artist, renderer, *args, **kwargs) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\figure.py", line 2780, in draw mimage._draw_list_compositing_images( File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\image.py", line 132, in _draw_list_compositing_images a.draw(renderer) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\artist.py", line 51, in draw_wrapper return draw(artist, renderer, *args, **kwargs) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\_api\deprecation.py", line 431, in wrapper return func(*inner_args, **inner_kwargs) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\axes\_base.py", line 2921, in draw mimage._draw_list_compositing_images(renderer, self, artists) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\image.py", line 132, in _draw_list_compositing_images a.draw(renderer) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\artist.py", line 51, in draw_wrapper return draw(artist, renderer, *args, **kwargs) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\text.py", line 1950, in draw if not self.get_visible() or not self._check_xy(renderer): File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\text.py", line 1536, in _check_xy xy_pixel = self._get_position_xy(renderer) File "C:\Users\XXX\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\text.py", line 1528, in _get_position_xy x, y = self.xy ValueError: too many values to unpack (expected 2)
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020