首先要做的是绘制CDF或者PDF,概率密度分布图和概率分布图,cdf其实就是pdf求导后的结果。有了概率分布图对x和y同时取对数,就知道是不是幂律分布了。
我的数据只有一列,用pandas读进来就行了,算每个x的概率就是Y,放df的两列中

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from scipy.stats import norm
import pandas as pd
#数据处理,准备好要拟合幂律分布的x和y
def DataGenerate():
    data = []
    data = pd.read_csv(r"C:\Users\Administrator\Desktop\概率密度图像绘制\26235.csv", header=None)
    #检查有没有空值,返回ture就是有false就是没有
    print(data.isnull().any())

    denominator = len(data[0])  # 分母数量
    Data = pd.Series(data[0])  # 将数据转换为Series利用分组频数计算
    Fre = Data.value_counts()
    Fre_sort = Fre.sort_index(axis=0, ascending=True)
    Fre_df = Fre_sort.reset_index()  # 将Series数据转换为DataFrame
    Fre_df[0] = Fre_df[0] / denominator  # 转换成概率np.log()
    Fre_df.columns = ['Rds', 'Fre']

    X = Fre_df['Rds']
    Y = Fre_df['Fre']
    # plot raw data
    Y=np.array(Y)
    plt.title("Raw data")
    plt.scatter(X, Y,  color='black')
    plt.show()
    #对x和y取对数
    X=np.log(X)  # 对X,Y取双对数
    Y=np.log(Y)
    return X,Y
#拟合幂律分布
def DataFitAndVisualization(X,Y):
    # 模型数据准备
    X_parameter=[]
    Y_parameter=[]
    for single_square_feet ,single_price_value in zip(X,Y):
       X_parameter.append([float(single_square_feet)])
       Y_parameter.append(float(single_price_value))

    # if len(Y_parameter):  #
    #     print('Y 为非空list')  # 存在值即为True
    # else:
    #     print('Y 为空list')  # 不存在值即为FALSE

    # 模型拟合
    regr = linear_model.LinearRegression()
    regr.fit(X_parameter, Y_parameter)
    # 模型结果与得分
    print('Coefficients: \n', regr.coef_,)
    print("Intercept:\n",regr.intercept_)
    # The mean square error
    print("Residual sum of squares: %.8f"
      % np.mean((regr.predict(X_parameter) - Y_parameter) ** 2))  # 残差平方和

    # 可视化
    plt.title("Log Data")
    plt.scatter(X_parameter, Y_parameter,  color='black')
    plt.plot(X_parameter, regr.predict(X_parameter), color='blue',linewidth=3)

    # plt.xticks(())
    # plt.yticks(())
    plt.show()

if __name__=="__main__":
    X,Y=DataGenerate()
    DataFitAndVisualization(X,Y)

最后要注意的是数据中不能出现0值和空值,不然会报错

  File "C:\Users\Administrator\PycharmProjects\untitled\venv\lib\site-packages\sklearn\utils\validation.py", line 100, in _assert_all_finite
    msg_dtype if msg_dtype is not None else X.dtype)
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

Process finished with exit code 1

有空值肯定不行,可以用如下来检查输入有没有空值`

#检查有没有空值,返回ture就是有false就是没有
    print(data.isnull().any())

如果没有空值还报错就是因为有0值,因为log0是无穷值,报错里都说了“a value too large for dtype(‘float64’)”。所以不能有0值。0值还会影响斜率,要么就直接删除掉0值。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐