Дерево решений (Decision Tree)
-
- Интересующийся
- Сообщения: 48
- Зарегистрирован: 20 ноя 2007, 22:17
- Репутация: 16
- Откуда: Mсква
Дерево решений (Decision Tree)
Здравствуйте !
Не могли бы уважаемые участники поделится опытом создания decision tree для растровых данных в R, по аналогии с тем что реализовано в Erdas или ENVI ?
зы: гугление особых успехов не принесло)
Не могли бы уважаемые участники поделится опытом создания decision tree для растровых данных в R, по аналогии с тем что реализовано в Erdas или ENVI ?
зы: гугление особых успехов не принесло)
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Дерево решений (Decision Tree)
обрисовываю в общих чертах, без углубления в детали, это выборка из более сложного моего кода, поэтому какие-то детали могут выпасть, но суть должна быть понятна, комментарии по коду
код использует куски из статьи про то как в R работать с растрами
код использует куски из статьи про то как в R работать с растрами
Код: Выделить всё
#понадобится два модуля, их надо будет перед выполнением установить
library(rgdal)
library(tree)
#тренировочные данные
traindata = matrix(as.integer(scan(file=trainname)),ncol=numbands+1,byrow=T)
#название класса (у меня - один из параметров тренировочных данных)
class=factor(traindata[,numbands+1])
#немного переделаем, поставим класс первым параметром
trainframe=data.frame(class,traindata[,1:numbands])
#если нужно, делаем выборку с возвращением, скажем 50% из тренировочного набора
numrows=length(trainframe[,1])
indexAll=1:numrows
numtrees=30
step=0.5
sampledata=sample(indexAll,numrows*step,replace=T)
samplesarray = cbind(samplesarray,sampledata)
sampledata=samplesarray[,i]
testdata=trainframe[sampledata,]
#наконец получили класс есть, данные есть, строим дерево
atree=tree(class ~.,data=testdata,mindev=0,minsize=1)
#часть 2, дерево построили, теперь надо натравить его на сам растр и его отклассифицировать
image = ... #тут указываем само изображение
#получаем его размерности на будущее
x = new("GDALReadOnlyDataset", image)
width = dim(x)[2]
height = dim(x)[1]
#пропускаем первые два параметра, это lat,long, их классифицировать не надо
imagedata = data.frame(getRasterTable(x)[3:(numbands+2)])
#наконец классифицируем
B=predict.tree(atree,newdata=imagedata,type="vector")
#сохраняем результат обратно в новое изображение
tif_driver <- new("GDALDriver", "GTiff")
tif2 <- new("GDALTransientDataset", tif_driver, height, width, 1, 'Int8')
resmtx = matrix(B,width,height)
bnd1 <- putRasterData(tif2, resmtx)
tif_file = "D:\\Programming\\R\\trees\\simple-tree-from-raster\\s_2000res.tif"
saveDataset(tif2, tif_file)
GDAL.close(tif2)
GDAL.close(tif_driver)
пристегивайтесь, турбулентность прямо по курсу
-
- Завсегдатай
- Сообщения: 386
- Зарегистрирован: 07 фев 2004, 14:31
- Репутация: 7
- Откуда: Лозанна
- Контактная информация:
Re: Дерево решений (Decision Tree)
а можно разобрать вот эту строку подробнее:
где здесь название класса? почему нужно использовать factor? что этим действием достигается?
Код: Выделить всё
#название класса (у меня - один из параметров тренировочных данных)
class=factor(traindata[,numbands+1])
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Дерево решений (Decision Tree)
название класса берется в данном случае из последнего столбца
а factor, так как у меня в примере классы были 1 и 2, фактор переведет их в строки "1" и "2", иначе получится дерево регрессий, а не дерево решений, правда результат все равно будет один и тот же, я подозреваю, но не факт
Код: Выделить всё
traindata[,numbands+1]
пристегивайтесь, турбулентность прямо по курсу
-
- Завсегдатай
- Сообщения: 386
- Зарегистрирован: 07 фев 2004, 14:31
- Репутация: 7
- Откуда: Лозанна
- Контактная информация:
Re: Дерево решений (Decision Tree)
спасибо большое!
а еще вопрос - в каком формате находится загружаемая матрица? это tif, img, grid или еще что-то (текстовый файл, таблица)?
и почему если это многоканальный растр, нельзя просто сказать numbands, а надо numbands+1?
а еще вопрос - в каком формате находится загружаемая матрица? это tif, img, grid или еще что-то (текстовый файл, таблица)?
и почему если это многоканальный растр, нельзя просто сказать numbands, а надо numbands+1?
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Дерево решений (Decision Tree)
можно tif, можно img, что засунешь, то rgdal и съест
numbands+1 это потому что в тренингах поле class - следующее после собственно каналов, а numbands берется из самих растров
numbands+1 это потому что в тренингах поле class - следующее после собственно каналов, а numbands берется из самих растров
пристегивайтесь, турбулентность прямо по курсу
-
- Завсегдатай
- Сообщения: 386
- Зарегистрирован: 07 фев 2004, 14:31
- Репутация: 7
- Откуда: Лозанна
- Контактная информация:
Re: Дерево решений (Decision Tree)
а что class не является еще одним каналом? как же он представлен в этом многоканальном растре?
я себе представляла матрицу тренингов чем-то вроде:
где класс - это еще один канал, просто содержащий либо значения 1 либо 2. или что-то я недопонимаю?
я себе представляла матрицу тренингов чем-то вроде:
Код: Выделить всё
#пикселя 1b 2b 3b class
1 234 123 56 1
2 230 131 46 1
3 134 223 16 2
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Дерево решений (Decision Tree)
да, class это еще один "канал", а точнее поле-атрибут, но канал набора треннингов, а не растра
он никак в растре не представлен, растр - это растр, тренинги это данные с растра + класс
он никак в растре не представлен, растр - это растр, тренинги это данные с растра + класс
пристегивайтесь, турбулентность прямо по курсу
-
- Завсегдатай
- Сообщения: 386
- Зарегистрирован: 07 фев 2004, 14:31
- Репутация: 7
- Откуда: Лозанна
- Контактная информация:
Re: Дерево решений (Decision Tree)
ок, тогда следующий вопрос - как представлены тренинги? какой-то особый тип данных\формат? и как их получить и привести в такой формат в R?
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Дерево решений (Decision Tree)
Код: Выделить всё
234 123 56 1
230 131 46 1
134 223 16 2
пристегивайтесь, турбулентность прямо по курсу
-
- Завсегдатай
- Сообщения: 386
- Зарегистрирован: 07 фев 2004, 14:31
- Репутация: 7
- Откуда: Лозанна
- Контактная информация:
Re: Дерево решений (Decision Tree)
все поняла спасибо. Это все просто в текстовом формате, а не в растре:) спасибо огромное!!
-
- Завсегдатай
- Сообщения: 386
- Зарегистрирован: 07 фев 2004, 14:31
- Репутация: 7
- Откуда: Лозанна
- Контактная информация:
Re: Дерево решений (Decision Tree)
продолжаю мучать вопросами
в данном случае, как может в cbind использоваться samplesarray если она только инициализируется на этом шаге?
Код: Выделить всё
samplesarray = cbind(samplesarray,sampledata)
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Дерево решений (Decision Tree)
а это мой глюк, возник когда я кусок кода вырезал из скрипта, дело в том, что для бэггинга, делается популяция выборок и все они запихиваются в массив
А потом по одному берутся из samplesarray для создания моделей.
Код: Выделить всё
samplesarray = array()
#create samples array
for(i in 1:numtrees) {
sampledata=sample(indexAll,numrows*step,replace=T)
samplesarray = cbind(samplesarray,sampledata)
}
samplesarray = samplesarray[,-1]
пристегивайтесь, турбулентность прямо по курсу
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость