連續變數離散化的幾種方法

2021-10-01 09:10:14 字數 1642 閱讀 5909

連續變數離散化有三種方法

1.等寬離散化

2.等頻離散化

3.利用聚類進行離散化

import numpy as np

import pandas as pd

#引數初始化

datafile = './data/discretization_data.xls' 

#讀取資料

data = pd.read_excel(datafile) 

data = data[u'肝氣鬱結證型係數'].copy()

k = 4

#等寬離散化,各個模擬依次命名為0,1,2,3

d1 = pd.cut(data, k, labels = range(k)) 

#等頻率離散化

w = [1.0*i/k for i in range(k+1)]

#使用describe函式自動計算分位數

w = data.describe(percentiles = w)[4:4+k+1] 

w[0] = w[0]*(1-1e-10)

d2 = pd.cut(data, w, labels = range(k))

from sklearn.cluster import kmeans #引入kmeans

kmodel = kmeans(n_clusters = k) #建立模型,n_jobs是並行數,一般等於cpu數較好

kmodel.fit(data.values.reshape((len(data), 1))) #訓練模型

c = pd.dataframe(kmodel.cluster_centers_).sort_values(0)#輸出聚類中心,並且排序(預設是隨機序的)

print(np.shape(c))

print("-------------")

print(c)

w = pd.rolling_mean(c, 2).iloc[1:] #相鄰兩項求中點,作為邊界點

w = [0] + list(w[0]) + [data.max()] #把首末邊界點加上

print("*****************")

print(w)

d3 = pd.cut(data, w, labels = range(k))

#自定義作圖函式來顯示聚類結果

def cluster_plot(d, k): 

import matplotlib.pyplot as plt

#用來正常顯示中文標籤

plt.rcparams['font.sans-serif'] = ['simhei'] 

#用來正常顯示負號

plt.rcparams['axes.unicode_minus'] = false 

plt.figure(figsize = (8, 3))

for j in range(0, k):

plt.plot(data[d==j], [j for i in d[d==j]], 'o')

plt.ylim(-0.5, k-0.5)

return plt

# 繪圖

cluster_plot(d1, k).show()

cluster_plot(d2, k).show()

cluster_plot(d3, k).show() 

連續變數離散化的原因

資料離散化是指將連續的資料進行分段,使其變為一段段離散化的區間。分段的原則有基於等距離 等頻率或優化的方法。資料離散化的原因主要有以下幾點 比如決策樹 樸素貝葉斯等演算法,都是基於離散型的資料展開的。如果要使用該類演算法,必須將離散型的資料進行。有效的離散化能減小演算法的時間和空間開銷,提高系統對樣...

離散變數和連續變數

離散變數是指其數值只能用自然數或整數單位計算的則為離散變數.例如,企業個數,職工人數,裝置台數等,只能按計量單位數計數,這種變數的數值一般用計數方法取得.反之,在一定區間內可以任意取值的變數叫連續變數,其數值是連續不斷的,相鄰兩個數值可作無限分割,即可取無限個數值.例如,生產零件的規格尺寸,人體測量...

特徵的轉換 02 連續變數的離散化

今日記事 把頭髮高高盤起,畫上一字眉。工作後就少了太多銳氣,磨得圓滑尚且是好,但圓了就難免要缺失點篤定的方向,最怕滾來滾去,滾回起點。而方向越篤定,心越沉下來,難免要變得好安靜。binarizer是將連續型變數根據某個閥值,轉換成二元的分類變數。小於該閥值的轉換為0,大於該閥值的轉換為1.如下 輸入...