多项式拟合忆阻器的相关数据,超详细解决忆阻器数据的拟合问题(还有很大改进空间)

将CSV中的数据导入,并且指定自己想要的数据

import pandas as pd

df = pd.read_csv('E:\I-V数据\RRAM_forming.csv')
data = df.iloc[222:, 1:3]

直接将csv里的数据读入,得到的是str字符串类型,所以要将字符串转化为float

print(type(a[0]))#打印列表第一个元素的类型
print(a[0])
a=list(map(float,a))#把list内的元素变成float型
print(type(a[0]))#显示改变后元素的类型
print(a)

因为想要做拟合,所以要分别得到已知的x和y:对x和y的数据类型做处理

这里申明一下,因为我的数据是捏滞回线,所以就相当于一个x,在图形上看起来会对应两个y,所以就要把我的数据分段处理。(其实有一个想法,就是当x单调递增的时候,一个函数拟合,递减的时候一个函数。)先把当x大于0的数据,分为了0-最大值,另一半数据从下一个到最后。两组数据分别得到它的预测数据,然后将x,y,y预测值一起画图。

    x = np.array(df.iloc[222:, 1])    #指定从222行开始的位置到最后一行,第二列的这一列数据为x
    x = list(map(float, x))           #x是元素为字符串的list,将其转化成float类型
    a = x.index(max(x))               #最大值的位置
    x1 = (x[0:a+1])                   #选择从0到最大值的数据
    x1 = np.array(x1)                 #转为数组类型
    x1 = x1.reshape(len(x1), 1)       #将x拉成一列
    x2 = (x[a+1:])                    #从最大的一个值下一个值到数据结束
    x2 = np.array(x2)                 
    x2 = x2.reshape(len(x2), 1)

    y = np.array(df.iloc[222:, 2])
    y = list(map(float, y))
    b = y.index(max(y))
    y1 = (y[0:b+1])
    y1 = np.array(y1)
    y1 = y1.reshape(len(y1), 1)
    y2 = (y[b+1:])
    y2 = np.array(y2)
    y2 = y2.reshape(len(y2), 1)

接下来就是做多项式拟合拟合

    def n_ploy_fit_formula(self):
        _x = self.x.reshape(self.m, 1)
        _y = self.y.reshape(self.m, 1)
        X = _x ** self.n
        for i in range(self.n - 1):
            X = np.hstack((X, _x ** (self.n - i - 1)))         #构建多项式的方程
        X = np.hstack((X, np.ones((self.m, 1))))               #加一个常数
        #通过线性代数已知x和y来求解各个系数
        self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(_y)   
        #用求解出来的方程和已知的x求解y的预测值
        self.y_hat = X.dot(self.w)                            
    return self.y_hat             
    #返回的是求得的预测值,因为要分别调用两次函数,所以要将预测值值拼接起来,最后将所有的值画图                        

判断拟合的结果如何(套用固定公式)

    def stats_cal(self):
        self.sst = ((self.y - self.y.mean()) ** 2).sum()
        self.sse = ((self.y - self.y_hat) ** 2).sum()
        self.ssr = ((self.y_hat - self.y.mean()) ** 2).sum()
        self.r2 = self.ssr / self.sst

画图

    def plot_PF(self, x, y, y_hat):
        x = np.array(x)
        x = x.reshape(len(x), 1)
        y = np.array(y)
        y = y.reshape(len(y), 1)

        plt.figure(figsize=(8, 6))
        plt.plot(x, y, '+', label='original data')
        plt.plot(x, y_hat, 'r-', lw=2, label='Polynomial Curve Fitting')
        plt.legend(fontsize=12)
        plt.grid(alpha=0.5)
        plt.show()

整个过程全部代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

class Ployfit:
    def __init__(self, x_data, y_data, n, label_list=None):
        if label_list is None:
            label_list = ['x', 'y']
        self.x = x_data
        self.y = y_data
        self.n = n  # 多项式阶数
        self.x_label = label_list[0]  # 自变量名称
        self.y_label = label_list[1]  # 因变量名称
        self.m = len(self.x)  # 样本量
        self.w = np.zeros((self.n, 1))
        self.y_hat = np.zeros((self.m, 1))
        self.sst = 0.0
        self.sse = 0.0
        self.ssr = 0.0
        self.r2 = 0.0

    def n_ploy_fit_formula(self):
        _x = self.x.reshape(self.m, 1)
        _y = self.y.reshape(self.m, 1)
        X = _x ** self.n
        for i in range(self.n - 1):
            X = np.hstack((X, _x ** (self.n - i - 1)))         #构建多项式的方程
        X = np.hstack((X, np.ones((self.m, 1))))               #加一个常数
        self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(_y)    #通过线性代数已知x和y来求解各个系数
        self.y_hat = X.dot(self.w)                             #用求解出来的方程和已知的x求解y的预测值
        return self.y_hat

    def stats_cal(self):
        self.sst = ((self.y - self.y.mean()) ** 2).sum()
        self.sse = ((self.y - self.y_hat) ** 2).sum()
        self.ssr = ((self.y_hat - self.y.mean()) ** 2).sum()
        self.r2 = self.ssr / self.sst
    
    def plot_PF(self, x, y, y_hat):
        x = np.array(x)
        x = x.reshape(len(x), 1)
        y = np.array(y)
        y = y.reshape(len(y), 1)

        plt.figure(figsize=(8, 6))
        plt.plot(x, y, '+', label='original data')
        plt.plot(x, y_hat, 'r-', lw=2, label='Polynomial Curve Fitting')
        plt.legend(fontsize=12)
        plt.grid(alpha=0.5)
        plt.show()

if __name__ == '__main__':
    df = pd.read_csv('E:\I-V数据\RRAM_forming.csv')
    data = df.iloc[222:, 1:3]
    x = np.array(df.iloc[222:, 1])    #指定从222行开始的位置到最后一行,第二列的这一列数据为
    x = list(map(float, x))           #x是内部为字符串的列表,将其转化成float类型
    a = x.index(max(x))               # 最大值的位置
    x1 = (x[0:a+1])
    x1 = np.array(x1)                 #转为数组类型
    x1 = x1.reshape(len(x1), 1)       #将x拉成一列
    x2 = (x[a+1:])
    x2 = np.array(x2)                 # 转为数组类型
    x2 = x2.reshape(len(x2), 1)

    y = np.array(df.iloc[222:, 2])
    y = list(map(float, y))
    b = y.index(max(y))
    y1 = (y[0:b+1])
    y1 = np.array(y1)
    y1 = y1.reshape(len(y1), 1)
    y2 = (y[b+1:])
    y2 = np.array(y2)
    y2 = y2.reshape(len(y2), 1)

    PF1 = Ployfit(x1, y1, 10)
    y1_hat = PF1.n_ploy_fit_formula()
    PF1.stats_cal()

    PF2 = Ployfit(x2, y2, 10)
    PF2.n_ploy_fit_formula()
    PF2.stats_cal()
    y2_hat = PF2.n_ploy_fit_formula()

    y_hat = np.append(y1_hat, y2_hat)
    PF2.plot_PF(x, y, y_hat)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值