Дерево решений (Decision Tree)
- 
				Igg
- Интересующийся
- Сообщения: 48
- Зарегистрирован: 20 ноя 2007, 22:17
- Репутация: 16
- Откуда: Mсква
							 Дерево решений (Decision Tree)
						Дерево решений (Decision Tree)
		
													
							
						
			
			
			
			
			Здравствуйте ! 
Не могли бы уважаемые участники поделится опытом создания decision tree для растровых данных в R, по аналогии с тем что реализовано в Erdas или ENVI ?
зы: гугление особых успехов не принесло)
			
			
									
						
										
						Не могли бы уважаемые участники поделится опытом создания decision tree для растровых данных в R, по аналогии с тем что реализовано в Erdas или ENVI ?
зы: гугление особых успехов не принесло)
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 748
- Ваше звание: 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
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 748
- Ваше звание: 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
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 748
- Ваше звание: 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
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 748
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Дерево решений (Decision Tree)
да, class это еще один "канал", а точнее поле-атрибут, но канал набора треннингов, а не растра
он никак в растре не представлен, растр - это растр, тренинги это данные с растра + класс
			
			
									
						
							он никак в растре не представлен, растр - это растр, тренинги это данные с растра + класс
пристегивайтесь, турбулентность прямо по курсу
			
						- 
				Анна
- Завсегдатай
- Сообщения: 386
- Зарегистрирован: 07 фев 2004, 14:31
- Репутация: 7
- Откуда: Лозанна
- Контактная информация:
Re: Дерево решений (Decision Tree)
ок, тогда следующий вопрос - как представлены тренинги?  какой-то особый тип данных\формат? и как их получить и привести в такой формат в R?
			
			
									
						
										
						- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 748
- Ваше звание: 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 если она только инициализируется на этом шаге?
в данном случае, как может в cbind использоваться samplesarray если она только инициализируется на этом шаге?
			
			
									
						
										
						 
Код: Выделить всё
samplesarray = cbind(samplesarray,sampledata)- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 748
- Ваше звание: 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]пристегивайтесь, турбулентность прямо по курсу
			
						Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя
