今天執行"資料離散化"部分**時出錯,環境python3.6+pycharm,網上各種查詢資料後發現原**主要是三個地方需要修改(下面紅色部分,原有問題**被注釋掉了)。修改並新增了部分注釋。
#-*- coding: utf-8 -*-
#資料規範化
import pandas as pd
datafile = '../data/discretization_data.xls' #引數初始化
data = pd.read_excel(datafile) #讀取資料
data = data[u'肝氣鬱結證型係數'].copy()
k = 4
d1 = pd.cut(data, k, labels = range(k)) #等寬離散化,各個模擬依次命名為0,1,2,3
#等頻率離散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1] #使用describe函式自動計算分位數
print(w)
w[0] = w[0]*(1-1e-10)
print(w[0])
d2 = pd.cut(data, w, labels = range(k))
from sklearn.cluster import kmeans #引入kmeans
kmodel = kmeans(n_clusters = k, n_jobs = 4) #建立模型,n_jobs是並行數,一般等於cpu數較好
# kmodel.fit(data.reshape((len(data), 1))) #訓練模型
kmodel.fit(data.values.reshape((len(data), 1))) #改動1 將data用reshape改為乙個n*1的陣列。(
# c = pd.dataframe(kmodel.cluster_centers_).sort(0) #輸出聚類中心,並且排序(預設是隨機序的)
c = pd.dataframe(kmodel.cluster_centers_).sort_values(0) #改動2 將訓練得到的聚類中心,按從小到大排序(
# w = pd.rolling_mean(c, 2).iloc[1:] #相鄰兩項求中點,作為邊界點
w = c.rolling(2).mean().iloc[1:] #改動3
w = [0] + list(w[0]) + [data.max()] #把首末邊界點加上
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 #用來正常顯示負號
資料離散化
離散化有兩種方法 第一種,先看一段 const int n 1e5 7 int t n a n int main 在這段 中,a經過離散,範圍就變成了m。解釋一下,unique是c 自帶的乙個函式,表示對乙個數列去重,然後返回不重複的元素個數,當然在後面要減去首位址。那麼這種離散化對於有重複元素的數...
資料離散化
一 概述 資料離散化是乙個非常重要的思想。為什麼要離散化?當以權值為下標的時候,有時候值太大,存不下。所以把要離散化的每乙個陣列裡面的數對映到另乙個值小一點的陣列裡面去。打個比方,某個題目告訴你有10 4個數,每個數大小不超過10 10,要你對這些數進行操作,那麼肯定不能直接開10 10大小的陣列,...
資料離散化
struct data d n 按x排序 sort d,d n for int i 0 i時間複雜度o nlogn 空間複雜度o n 用於無重複資料 lower bound a,a n,x a 1 返回a中第乙個大於等於x的位置 unique a,a 1 n a 1 a,減首位址返回將aa陣列去重後...