ন্যালি এবং স্ক্লার্নে পিসিএ বিভিন্ন ফলাফল দেয়


21

আমি কি কিছু ভুল বুঝছি? এটি আমার কোড

Sklearn ব্যবহার

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import decomposition
from sklearn import datasets
from sklearn.preprocessing import StandardScaler

pca = decomposition.PCA(n_components=3)

x = np.array([
        [0.387,4878, 5.42],
        [0.723,12104,5.25],
        [1,12756,5.52],
        [1.524,6787,3.94],
    ])
pca.fit_transform(x)

আউটপুট:

array([[ -4.25324997e+03,  -8.41288672e-01,  -8.37858943e-03],
   [  2.97275001e+03,  -1.25977271e-01,   1.82476780e-01],
   [  3.62475003e+03,  -1.56843494e-01,  -1.65224286e-01],
   [ -2.34425007e+03,   1.12410944e+00,  -8.87390454e-03]])

নোংরা পদ্ধতি ব্যবহার করে

x_std = StandardScaler().fit_transform(x)
cov = np.cov(x_std.T)
ev , eig = np.linalg.eig(cov)
a = eig.dot(x_std.T)

আউটপুট

array([[ 0.06406894,  0.94063993, -1.62373172],
   [-0.35357757,  0.7509653 ,  0.63365168],
   [ 0.29312477,  0.6710958 ,  1.11766206],
   [-0.00361615, -2.36270102, -0.12758202]])
I have kept all 3 components but it doesnt seem to allow me to retain my original data.

আমি জানতে পারি কেন এমন হয়?

আমি যদি আমার আসল ম্যাট্রিক্সটি ফিরে পেতে চাই তবে আমার কী করা উচিত?


আপনার অদ্ভুত কোডটি ভুল আইএমএইচও (এটিও ব্যবহার করে Xযা সংজ্ঞাযুক্ত নয়)। আপনার গণিতে পুনরায় পরীক্ষা করুন
অ্যানি-মাউস-রিনিস্টেট মনিকা

আমি আইপথন নোটবুক ব্যবহার করছি যাতে আমি কেবলমাত্র কক্ষগুলি অনুলিপি করতে পারি। আমার গণিত কি ভুল? কোন অংশ @
অ্যানি

@ অ্যানি-মাউস হ্যাঁ আমি আমার ত্রুটিটি বুঝতে পেরেছিলাম তবে এটি এখনও মেলে না
অ্যাসেমিনিয়ার

@aceminer আমি কৌতূহল যে কেন আপনি x_std.T এর কোভারিয়েন্স ম্যাট্রিক্স গণনা করেন, x_std নয়?
এভেজেনি নবোকভ

@ এভেজেনিনাবোকভ অনেক দীর্ঘ হয়েছে
শুভ

উত্তর:


21

পার্থক্যটি হ'ল decomposition.PCAপিসিএ করার আগে আপনার ভেরিয়েবলগুলি মানক করে না, যখন আপনার ম্যানুয়াল গণনায় আপনি মানককরণের StandardScalerজন্য ডাকে । সুতরাং, আপনি এই পার্থক্যটি পর্যবেক্ষণ করছেন: পারস্পরিক সম্পর্ক বা সমবায় উপর পিসিএ?

যদি আপনি প্রতিস্থাপন

pca.fit_transform(x)

সঙ্গে

x_std = StandardScaler().fit_transform(x)
pca.fit_transform(x_std)

আপনি ম্যানুয়াল গণনার সাথে একই ফলাফল পাবেন ...

... তবে কেবল পিসিগুলির অর্ডার পর্যন্ত। কারণ আপনি যখন চালানো

ev , eig = np.linalg.eig(cov)

আপনি কমানো ক্রম হিসাবে অগত্যা না খালি পেতে। আমি পাই

array([ 0.07168571,  2.49382602,  1.43448827])

সুতরাং আপনি তাদের ম্যানুয়ালি অর্ডার করতে চাইবেন। স্ক্লের্ন এটি আপনার জন্য করে।


আসল ভেরিয়েবলগুলি পুনর্গঠনের বিষয়ে, দয়া করে দেখুন কীভাবে পিসিএ বিপরীত করবেন এবং বেশ কয়েকটি মূল উপাদান থেকে মূল ভেরিয়েবলগুলি পুনর্গঠন করবেন?


শুধু চেক করতে চাই। ম্যাট্রিক্সকে এর প্রমিত বিচ্যুতির মাধ্যমে বাস্তবায়িত করা কি সত্যিই প্রয়োজনীয়? আমি উদাহরণগুলি দেখেছি যেখানে তারা এটি করে না
এসেমিনার

এটি প্রয়োজনীয় নয় , এটি করার একটাই উপায়। আমি প্রথম অনুচ্ছেদে যে লিঙ্কটি রেখেছি তা দেখুন : stats.stackexchange.com/questions/53 - এটি আসলে এই প্রশ্নটি সম্পর্কে। আপনি যদি মানক হন, তবে আপনি পারস্পরিক সম্পর্কের বিষয়ে পিসিএ করেন। আপনি যদি না করেন তবে আপনি সমবায় নিয়ে পিসিএ করেন।
অ্যামিবা বলছেন মনিকাকে

9

পাইথনে পিসিএর আলোচনা এবং ব্যাখ্যা সহ এখানে একটি সুন্দর বাস্তবায়ন is এই বাস্তবায়ন সাইকিট পিসিএর মতো একই ফলাফলের দিকে নিয়ে যায়। এটি অন্য একটি সূচক যা আপনার পিসিএটি ভুল।

import numpy as np
from scipy import linalg as LA

x = np.array([
        [0.387,4878, 5.42],
        [0.723,12104,5.25],
        [1,12756,5.52],
        [1.524,6787,3.94],
    ])

#centering the data
x -= np.mean(x, axis = 0)  

cov = np.cov(x, rowvar = False)

evals , evecs = LA.eigh(cov)

আপনাকে ইগেনভ্যালুগুলি (এবং সেই অনুসারে ইগেনভেক্টরগুলি) অবতরণকে সাজানো দরকার

idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]

a = np.dot(x, evecs) 

সাধারণত, আমি আপনাকে একটি সাধারণ উদাহরণ (যতটা সম্ভব সহজ) প্রয়োগ করে এবং সঠিক ফলাফলগুলি (এবং মধ্যবর্তী ফলাফল) হাতে হাতে গণনা করে আপনার কোডটি পরীক্ষা করার পরামর্শ দিচ্ছি। এটি আপনাকে সমস্যা চিহ্নিত করতে সহায়তা করে।


1
এই উত্তরটি ভালবাসি। এটা আমার সমস্যার সমাধান!
জিনুয়া ওয়াং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.